Swift 4 декодирует простое значение JSON корневого уровня

согласно стандарту JSON RFC 7159, это действительно json:

22

как декодировать это в Int с помощью декодируемого swift4? Это не работает

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

1 ответов


он работает с хорошим 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
}