JSON Write выдает недопустимый тип

Когда я пытаюсь написать некоторые данные для какого-то ML внутри API, например, в Postman, запись работает, но по какой-то причине, когда я пишу ее в Swift, у меня возникают проблемы:

func makePOSTRequest() {
        
        print("entered request function")
        
        guard let url = URL(string: "https://doctagon.herokuapp.com/diagnose") else {
            print("error with getting the URL")
            return
        }
        print("got the URL")
        
        var request = URLRequest(url: url)
        print("Got the request")
        // method, body, headers?
        request.httpMethod = "POST"
        print("got the http.method = 'POST'")
        
        // might not need this --> request.setValue(" symptoms", forHTTPHeaderField: "Content-Type")
        let body: [String: AnyHashable] = [
            "symptoms": ["Headache", "Sweating"]
        ]
        print("got the body")
        
        print("About to enter the .httpBody part of the code")
        request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
        //Make the request
        let task = URLSession.shared.dataTask(with: request) { data, _, error in
            guard let data = data, error == nil else {
                print("error with making sure that there is data")
                return
            }
            print("got data")
            do {
                let response = try JSONSerialization.data(withJSONObject: data, options: .fragmentsAllowed)
                print("SUCCESS \(response)")
            } catch {
                print("error with the conversion of the JSOn")
                print(error)
            }
        }
        task.resume()
        print("resumed Task")
    }

с моей ошибкой:

2022-11-19 23:39:30.335160-0500 Doctagon[88188:1838200] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Foundation.__NSSwiftData)'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000018040e7ec __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x0000000180051144 objc_exception_throw + 56
    2   Foundation                          0x0000000180c446f8 _writeJSONValue + 704
    3   Foundation                          0x0000000180c443f8 -[_NSJSONWriter dataWithRootObject:options:] + 84
    4   Foundation                          0x0000000180c470d0 +[NSJSONSerialization dataWithJSONObject:options:error:] + 108
    5   Doctagon                            0x0000000100be4080 $s8Doctagon12QuestionViewV15makePOSTRequestyyFy10Foundation4DataVSg_So13NSURLResponseCSgs5Error_pSgtYbcfU_ + 544
    6   Doctagon                            0x0000000100be45ec $s10Foundation4DataVSgSo13NSURLResponseCSgs5Error_pSgIeghggg_So6NSDataCSgAGSo7NSErrorCSgIeyBhyyy_TR + 264
    7   CFNetwork                           0x0000000183df9928 CFNetwork + 31016
    8   CFNetwork                           0x0000000183e14a4c _CFHTTPMessageSetResponseProxyURL + 14648
    9   libdispatch.dylib                   0x0000000104c30594 _dispatch_call_block_and_release + 24
    10  libdispatch.dylib                   0x0000000104c31d5c _dispatch_client_callout + 16
    11  libdispatch.dylib                   0x0000000104c3a040 _dispatch_lane_serial_drain + 928
    12  libdispatch.dylib                   0x0000000104c3adb8 _dispatch_lane_invoke + 484
    13  libdispatch.dylib                   0x0000000104c48b40 _dispatch_workloop_worker_thread + 1720
    14  libsystem_pthread.dylib             0x00000001af2568fc _pthread_wqthread + 284
    15  libsystem_pthread.dylib             0x00000001af2556c0 start_wqthread + 8
)
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Foundation.__NSSwiftData)'
terminating with uncaught exception of type NSException
CoreSimulator 857.13 - Device: iPhone 14 Pro (4108291D-D836-4715-8386-5237B6D217E7) - Runtime: iOS 16.1 (20B72) - DeviceType: iPhone 14 Pro

Я до сих пор не понимаю своей проблемы, потому что я смог нормально запустить ее в Postman, но как только я зашел в Xcode, код перестал работать.

Я думаю, что ошибка в этой строке: let response = try JSONSerialization.data(withJSONObject: data, options: .fragmentsAllowed)

Использование AnyHashable в качестве типа значения словаря для меня не имеет смысла, я бы изменил его на Any. Может быть, не имеет отношения к аварии, но все же кое-что, что я бы изменил.

Joakim Danielson 20.11.2022 09:27

Изменение значения словаря на Any дало бы мне nil

Anish 20.11.2022 14:08

Это не для меня, но у вас есть решение ниже, и это важно.

Joakim Danielson 20.11.2022 15:12

Я бы предложил изменить его на тип Any, но это может быть из-за того, как был настроен мой API. Вы использовали один и тот же ключ?

Anish 20.11.2022 15:44

Да, я использовал let body: [String: Any]

Joakim Danielson 20.11.2022 18:56
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
5
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

то, что вы пытаетесь сделать, это создать объект json (в данном случае это будет экземпляр Dictionary<String: Any>), используя данные, полученные из сети. так что вам следует звонить JSONSerialization.jsonObject(with: data) вместо этого.

Другие вопросы по теме