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

jim*_*jon 38 alamofire swift3

为什么以下代码会给我错误:

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

此行引发错误:

urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)
Run Code Online (Sandbox Code Playgroud)

完整代码:

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
    }
Run Code Online (Sandbox Code Playgroud)

ddi*_*ego 45

我有这个问题,因为我的一个字符串是可选的.它试图序列化一个值,如:"Optional(\"string value \")"

而不是"字符串值"

  • 当你的JSON必须有空值时,你会怎么做?根据[http://www.json.org/](http://www.json.org/),JSON可以保存空值. (7认同)

Kri*_*aCA 34

如果您的问题仍未通过此处给出的答案解决.我相信里面的一个对象parameters可能不是的一个实例NSString,NSNumber,NSArray,NSDictionary,或NSNull.如JSONSerialization课程文档中所示:

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

  1. 顶级对象是NSArray或NSDictionary.所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例.

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

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

因此,请检查对象中的任何parameters对象是否不满足上述约束.


gmo*_*mes 11

万一有人仍然遇到问题而且正在使用枚举,另一个原因可能是你传递了一个枚举值而不是它的rawValue.

例:

enum Status: String {
  case open
  case closed
}
Run Code Online (Sandbox Code Playgroud)

而不是传递枚举:

params = ["status": Status.open]
Run Code Online (Sandbox Code Playgroud)

通过

params = ["status": Status.open.rawValue]
Run Code Online (Sandbox Code Playgroud)

  • 正是这个!谢谢 :) (2认同)

小智 8

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

let checker = JSONSerialization.isValidJSONObject(parameters)
Run Code Online (Sandbox Code Playgroud)


小智 6

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