一尘不染

Swift 4解码简单的根级别JSON值

swift

根据JSON标准RFC 7159,这是有效的json:

22

如何使用swift4的可解码代码将此解码为Int?这行不通

let twentyTwo = try? JSONDecoder().decode(Int.self, from: "22".data(using: .utf8)!)

阅读 292

收藏
2020-07-07

共1个答案

一尘不染

它可以很好地JSONSerialization.allowFragments
阅读选项配合使用。从文档中

allowFragments

指定解析器应允许不是NSArray或NSDictionary实例的顶级对象。

例:

let json = "22".data(using: .utf8)!

if let value = (try? JSONSerialization.jsonObject(with: json, options: .allowFragments)) as? Int {
    print(value) // 22
}

但是,JSONDecoder没有这样的选项,并且不接受不是数组或字典的顶级对象。可以在
源代码中看到该decode()方法调用
JSONSerialization.jsonObject()而没有任何选择:

open func decode<T : Decodable>(_ type: T.Type, from data: Data) throws -> T {
    let topLevel: Any
    do {
       topLevel = try JSONSerialization.jsonObject(with: data)
    } catch {
        throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: error))
    }

    // ...

    return value
}
2020-07-07