2017-10-16 10 views
1

Selon la norme JSON RFC 7159, ceci est valable JSON:Swift 4 decode simple, racine valeur JSON

22 

Comment puis-je décode cela en un Int utilisant décodable de swift4? Cela ne fonctionne pas

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

ce n'est pas un JSON valide, un JSON est faite par des paires de clés et de valeur et il est juste une valeur. –

+2

Ceci est un fragment JSON valide, pas JSON valide. – Sulthan

+0

Je suppose que cela dépend de la norme utilise. Découvrez RFC 7159 ici https://jsonformatter.curiousconcept.com/. aussi source qu'il est valide https://tools.ietf.org/html/rfc7159#section-3 – saph

Répondre

5

Il fonctionne avec un bon vieux JSONSerialization et l'option lecture .allowFragments . De l'documentation:

allowFragments

Indique que l'analyseur doit permettre à des objets de haut niveau qui ne sont pas une instance de NSArray ou NSDictionary.

Exemple:

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

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

Cependant, JSONDecoder n'a pas cette option et ne pas accepter de haut niveau objets qui ne sont pas des tableaux ou des dictionnaires. On peut voir dans le source code que la méthode decode() appelle JSONSerialization.jsonObject() sans aucune option:

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 
} 
+1

Vous pouvez essayer de déposer un rapport de bogue chez Apple. –