'NSInvalidArgumentException',原因:“ JSON写入(__SwiftValue)中的类型无效”

时间:2019-05-12 13:33:26

标签: swift nsjsonserialization

尝试编码对象时出现以下错误。

  

'NSInvalidArgumentException',原因:“ JSON写入(__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,即使对于已正确编码的请求也是如此。

1 个答案:

答案 0 :(得分:0)

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

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

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

JSONSerialization只能编码以下类型:ArrayDictionaryStringBool和数字类型(例如Double,{ {1}}。