根据JSON标准RFC 7159,这是有效的json:
22
如何使用swift4的可解码代码将此解码为Int?这行不通
let twentyTwo = try? JSONDecoder().decode(Int.self, from: "22".data(using: .utf8)!)
它可以很好地JSONSerialization与.allowFragments 阅读选项配合使用。从文档中:
JSONSerialization
.allowFragments
allowFragments 指定解析器应允许不是NSArray或NSDictionary实例的顶级对象。
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()而没有任何选择:
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 }