13

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

22

如何使用 swift4 的可解码将其解码为 Int?这不起作用

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

2 回答 2

15

它适用于良好的 ol'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
}
于 2017-10-16T11:30:27.510 回答
5

在 iOS 13.1+ 和 macOS 10.15.1+中,可以在根级别JSONDecoder处理原始类型。

请参阅 Martin 答案下方链接文章中的最新评论(2019 年 10 月)。

于 2019-12-09T22:42:34.407 回答