'NSInvalidArgumentException',原因:'Invalid type in JSON write (__SwiftValue)'

'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__SwiftValue)'

当我尝试对对象进行编码时出现以下错误。

'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__SwiftValue)'

这个对象的定义如下:-

public struct Item: Codable {
    public var _id: Int
    public var name: String
    public var price: Float

    public init(_id: Int, name: String, price: Float) {
        self._id = _id
        self.name = name
        self.price = price
    }    

    public enum CodingKeys: String, CodingKey {
        case _id = "id"
        case name
        case price
    }
}

我正在尝试通过以下方式对其进行编码:

public func createDictionaryRequestForAddingItems(item : Item)->Data{
    let dictRequest = ["item":item];
    let dataRequest = try! JSONSerialization.data(withJSONObject: dictRequest, options: []);
    return dataRequest;
}

如果我直接使用像 String 或 Int 这样的简单对象而不是项目对象,那么一切正常,但是当请求需要一个 Item 对象(IS-A Codable实例)然后它给出了上述错误。

JSONSerialization.isValidJSONObject(item) 总是给出 false,即使对于正确编码的请求也是如此。

问题是您试图组合两种类型的 JSON 编码。 JSONSerializationCodableJSONSerializationCodable无关。

实际上,你想要这样的东西:

public func createDictionaryRequestForAddingItems(item: Item) -> Data {
   let dictRequest = ["item": item]
   let dataRequest = try! JSONEncoder().encode(dictRequest)
   return dataRequest
}

JSONSerialization 只能编码以下类型:ArrayDictionaryStringBool 和数字类型(例如 Double , Int).