JSONSerialization JSON 写入中的类型无效 (_SwiftValue)

Posted

技术标签:

【中文标题】JSONSerialization JSON 写入中的类型无效 (_SwiftValue)【英文标题】:JSONSerialization Invalid type in JSON write (_SwiftValue) 【发布时间】:2016-09-15 22:45:33 【问题描述】:

为什么下面的代码给我错误:

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
    

【问题讨论】:

如果我做对了,你的"status" 键包含code 值,它的类型是Enum,那么就会出现这个错误。将代码更改为code.rawValue 【参考方案1】:

如果此处给出的答案仍未解决您的问题。我相信parameters 中的一个对象可能不是NSStringNSNumberNSArrayNSDictionaryNSNull 的实例。如JSONSerialization 类的文档中所述:

可以转换为 JSON 的对象必须具有以下属性:

    ***对象是 NSArray 或 NSDictionary。 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。

    所有字典键都是 NSString 的实例。 数字不是 NaN 或无穷大。

    可能适用其他规则。调用 isValidJSONObject(_:) 或尝试转换是判断给定对象是否可以转换为 JSON 数据的明确方法。

所以,请检查您的parameters 对象中是否有任何对象不满足上述限制。

【讨论】:

在我的情况下,每个键值都很好,但我仍然收到此错误@KrishnaCA @Mansuu....如果您的字符串是可选的,请检查是否有一个,如下所示 如何将我的可编码类对象转换为有效的 JSON 对象?【参考方案2】:

我遇到了这个问题,这是因为我的字符串之一是可选的。它试图序列化一个值,如: "可选(\"字符串值\")"

而不是“字符串值”

【讨论】:

我也是,只是不得不将我的参数设为字符串而不是字符串?。 当你的 JSON 中必须有一个空值时你会怎么做?根据http://www.json.org/,JSON 可以保存空值。 也解决了我的问题。我认为这是 Swift 3 的第一个 NSNull() 值,但它仅来自可选字符串。 rudenudedude 这样的东西对我有用让参数:[String: Any] = ["someValue": ["someNestedValueKey": min ?? NSNull(), ] ]【参考方案3】:

以防万一有人仍然遇到问题并且正在使用 Enums,另一个原因可能是您传递的是 Enum 值而不是 rawValue。

例子:

enum Status: String 
  case open
  case closed

而不是传递枚举

params = ["status": Status.open]

通过

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

【讨论】:

正是这个!谢谢:)【参考方案4】:

你也可以调用这个方法,看看你的参数是否可以转换为JSON对象,这将返回一个Bool。

let checker = JSONSerialization.isValidJSONObject(parameters)

【讨论】:

【参考方案5】:

在我的例子中,我不小心将对象而不是字符串添加到了参数字典中

【讨论】:

【参考方案6】:

如果您使用 SwiftyJSON 访问 JSON 对象,请务必使用 JSON 的 dictionaryObject 属性(而不是使用 dictionaryValue、@ 987654323@ 或什么都没有),否则你会得到这个错误(或它的变体)。例如:

guard let jsonDict = json.dictionaryObject else 
    return


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

【讨论】:

你先生,是个传奇。请知道。【参考方案7】:

使用与 Foundation NSSet 链接的 Set 时出现此错误。

let myArray = Array(mySet)

【讨论】:

【参考方案8】:

和你有同样的问题和错误!终于找到问题了...

我的代码

params = [
    "gender": request.gender.first ?? "",
    "age": 15
]

问题:尽管request.gender.first ?? "" 返回一个字符串,但它的类型是String.Element,任何JSONEncoderJSONSerialization 都无法编码​​(并且不在它的类型列表中可以处理,根据文档)。

解决方案

params = [
    "gender": request.gender.first?.description ?? "",
    "age": 15
]

通常,只需确保它是编码器可以处理的字符串或适当的数字...

【讨论】:

【参考方案9】:

首先你应该将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];

【讨论】:

【参考方案10】:

我收到了这个 runtime 错误,因为我的字典是这样的:

var dictionary: [AnyHashable: Any] = [:]
let elapsedTime = Date.timeIntervalSince(oldDate)
dictionary["elapsedTime"] = elapsedTime

你能告诉我问题是什么吗? 将鼠标悬停在下面的方框上以查看答案!

elapsedTime 的类型是 Function 它不是 TimeInterval。 我需要将Date. 更改为Date().,即使用实例方法而不是静态方法。 当您的字典值为 Any 时,直到出现无法将字典序列化为 JSON 字符串的运行时错误,才会发现此类问题...

【讨论】:

以上是关于JSONSerialization JSON 写入中的类型无效 (_SwiftValue)的主要内容,如果未能解决你的问题,请参考以下文章

Swift - JSONSerialization 无效的 JSON

Swift - JSONSerialization 无效的 JSON

java JSONSerialization(JAVA到JSON)

44-Swift 之 JSONSerialization

JSON 文本在 JSONSerialization Swift 中没有以数组错误开头

添加嵌套字典会导致 JSONSerialization 返回 nil