根据 JSON 标准 RFC 7159,这是有效的 JSON:
22
如何使用swift4的decodable将此内容解码为Int?这样做不起作用。
let twentyTwo = try? JSONDecoder().decode(Int.self, from: "22".data(using: .utf8)!)
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
}
JSONDecoder
可以处理根级别的基本类型。
try
语句放在Do..Catch
中并处理错误,它会告诉你你的JSON格式不正确。那不是一个有效的JSON,你为什么还要坚持使用它呢? - Desdenova