Подтвердить что ты не робот

JSONSerialization Недопустимый тип записи JSON (_SwiftValue)

Почему следующий код дает мне ошибку:

Недопустимый тип в записи JSON (_SwiftValue).

Ошибка выводится на эту строку:

urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)

Полный код:

let parameters:Parameters = ["resource":[
        [
            "appUserCode":uuidString,
            "productNFCode": self.nfCode!,
            "status":code,
            "applicationKey":appDelegate.api_key
        ]
        ]
    ]
    do {

        urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)
    } catch {
        // No-op
    }
4b9b3361

Ответ 1

Если ваша проблема по-прежнему не решена с помощью приведенного здесь ответа. Я считаю, что один из ваших объектов внутри parameters может не быть экземпляром NSString, NSNumber, NSArray, NSDictionary или NSNull. Как указано в документации для JSONSerialization class:

Объект, который может быть преобразован в JSON, должен иметь следующие свойства:

  • Объект верхнего уровня - NSArray или NSDictionary. Все объекты являются экземплярами NSString, NSNumber, NSArray, NSDictionary или NSNull.

  • Все словарные ключи являются экземплярами NSString. Числа не NaN или бесконечность.

  • Могут применяться другие правила. Вызов isValidJSONObject (_:) или попытка преобразования - это окончательные способы определить, может ли данный объект быть преобразован в данные JSON.

Итак, проверьте, не соответствует ли какой-либо из объектов вашего объекта parameters указанным выше ограничениям.

Ответ 2

У меня была эта проблема, и это было потому, что одна из моих строк была необязательной. Он пытался сериализовать значение, подобное: "Необязательный (\" строковое значение \ ")"

Вместо "строкового значения"

Ответ 3

На всякий случай, если у кого-то все еще есть проблемы и использует Enums, может возникнуть другая причина, если вы передаете значение Enum, а не rawValue.

Пример:

enum Status: String {
  case open
  case closed
}

вместо передачи перечисления:

params = ["status": Status.open]

передать

params = ["status": Status.open.rawValue]

Ответ 4

Если вы используете SwiftyJSON для доступа к объекту JSON, важно использовать свойство dictionaryObject JSON (вместо использования dictionaryValue, dictionary или вообще ничего), потому что в противном случае вы получите эту ошибку (или ее вариант). Например:

guard let jsonDict = json.dictionaryObject else {
    return
}

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])

Ответ 5

Вы должны преобразовать NSObject в NSDictionary на первый

Попробуйте это преобразовать в NSDictionary.

#import <objc/runtime.h>

//Add this utility method in your class.
+ (NSDictionary *)dictionaryWithPropertiesOfObject:(id)obj {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    unsigned count;
    objc_property_t *properties = class_copyPropertyList([obj class], &count);

    for (int i = 0; i < count; i++) {
        NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
        [dict setObject:[obj valueForKey:key] ? [obj valueForKey:key] : @"" forKey:key];
    }

    free(properties);

    return [NSDictionary dictionaryWithDictionary:dict];
}

Тогда назовите это:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

Ответ 6

Я получил эту ошибку, когда использовал Set который связан с Foundation NSSet.

let myArray = Array(mySet)

Ответ 7

Вы также можете вызвать этот метод и посмотреть, может ли ваш параметр быть преобразован в объект JSON, это вернет Bool.

let checker = JSONSerialization.isValidJSONObject(parameters)

Ответ 8

В моем случае я случайно добавил объект в словарь параметров вместо строки