【问题标题】:'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__SwiftValue)''NSInvalidArgumentException',原因:'JSON 写入中的类型无效(__SwiftValue)'
【发布时间】:2019-05-12 13:33:25
【问题描述】:

我在尝试对对象进行编码时收到以下错误。

'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 对象,则一切正常,但是当请求需要 Item 对象(即 IS-A Codable 实例)时,它会给出上面的错误。

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

【问题讨论】:

    标签: swift nsjsonserialization


    【解决方案1】:

    问题在于您正在尝试组合两种类型的 JSON 编码。 JSONSerializationCodableJSONSerializationCodable无关。

    其实,你想要这样的东西:

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

    JSONSerialization 只能编码以下类型:ArrayDictionaryStringBool 和数字类型(例如 DoubleInt)。

    【讨论】:

    • JSONSerialization 与 Codable 无关 是一个相当大胆的声明??
    • @vadian 好吧,它没有:)
    猜你喜欢
    • 2012-12-29
    • 2019-10-26
    • 2017-03-12
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2015-11-16
    相关资源
    最近更新 更多