Que font les options JSONSerialization et comment changent-elles jsonResult?

j'utilise JSONSerialization assez souvent dans mon projet. Voici un exemple de mon JSONSerialization code:

let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any] 

Remarque:: les Options sont manquantes et je les ai normalement dans mon projet.

Mon problème est que je ne suis pas assez sûr de ce que ces options: [] faire?

Ce que j'ai trouvé sur les options:

NSJSONReadingMutableContainers:

spécifie que les tableaux et les dictionnaires sont créés comme des objets mutables.

NSJSONReadingMutableLeaves:

spécifie que les chaînes de caractères de feuilles dans le graphe d'objet JSON sont créées comme suit: les cas de NSMutableString.

NSJSONReadingAllowFragments:

spécifie que l'analyseur doit permettre les objets de premier niveau qui ne sont pas une instance de NSArray ou NSDictionary.

Note2: j'ai trouvé ces définitions sur : https://developer.apple.com/reference/foundation/nsjsonreadingoptions

ma question Est: Quelqu'un peut-il s'il vous plaît m'expliquer les différences entre ces options , ce que je devrais les utiliser pour et si vous pouvez me montrer un exemple de code de ces options, il serait parfait :).

Toute aide appréciée.

Merci.

17
demandé sur 0ndre_ 2016-10-15 13:24:18

3 réponses

brève réponse pour les deux premières options:

ignorez-les dans Swift!

dans Swift vous pouvez rendre les objets mutables juste avec le var mot clé.

dans L'objectif-C d'un autre côté, vous avez besoin des options pour faire les types de collecte

NSArray/NSDictionary mutable -> NSMutableArray/NSMutableDictionaryNSJSONReadingMutableContainers option ou les chaînes de valeur -> NSMutableStringNSJSONReadingMutableLeaves.

dans les deux objectifs-C et Swift si vous ne sont lecture le JSON vous n'avez pas besoin de mutabilité du tout.

NSJSONReadingAllowFragments est important si l'objet racine du JSON un tableau ou d'un dictionnaire. Si c' un tableau ou d'un dictionnaire, vous pouvez omettre cette option, trop.

la paire de crochets vides [] représente No options (options peut être omis dans Swift 3).

20
répondu vadian 2017-04-27 09:20:37

vous feriez mieux de savoir comment les valeurs JSON sont importées dans iOS world:

 JSON array ->  NSArray
 JSON object -> NSDictionary
 JSON number -> NSNumber
 JSON string -> NSString
 JSON true   -> NSNumber
 JSON false  -> NSNumber
 JSON null   -> NSNull

(vous devriez aussi vérifier les RFC de JSON. RFC-4627, RFC-7159)

Puis re-vérifier la toutes options:

mutableContainers (NSJSONReadingMutableContainers):

garantit le NSArrayou NSDictionarys contenues dans le résultat doit être NSMutableArrayou NSMutableDictionary s. Quelqu'un dit en plus vieux iOSs JSONSerialization (NSJSONSerialization) retourné mutable objets sans spécifier mutableContainers, mais en fonction de cela n'est pas recommandé, et en fait vous pouvez trouver quelqu'un signalant un tel code ne fonctionne pas dans iOS 10.

dans Swift, la mutabilité est représentée par var et let, donc vous n'avez pas besoin d'utiliser cette option dans les codes Swifty. Seulement nécessaire lorsque vous moulez certaines parties du résultat désérialisé à NSMutableArray ou NSMutableDictionary. Je recommande fortement de réécrire ces codes d'une manière plus rapide.

mutableLeaves (NSJSONReadingMutableLeaves):

garantit le NSStrings contenues dans le résultat doit être NSMutableString S. Rarement utilisé, même dans les vieux Codes objectifs-C, ignorez-le.

allowFragments (NSJSONReadingAllowFragments):

dans l'ancienne RFC (RFC-4627), seul le tableau et l'objet étaient valides comme constituant externe de JSON. Si vous vous attendez à ce tableau ou d'un objet (NSDictionary) à partir du serveur, ne pas spécifier cette option vous aiderait à trouver la valeur retournée invalide à partir du serveur un peu peu plus tôt.

voir la différence de codes:

supposons data1 est un UTF-8 valide représentation du JSON suivants:

[{"name": "aaa", "value": 123}, {"name": "bbb", "value": 456}]

Et le code:

do {
    let result = try JSONSerialization.jsonObject(with: data1)
    let resultArray = result as! NSMutableArray //->This may cause your app crash
    //->Could not cast value of type '__NSArrayI' (0x105e79c08) to 'NSMutableArray' (0x105e79cd0).
    print(resultArray)
} catch {
    print(error)
}

do {
    let result = try JSONSerialization.jsonObject(with: data1, options: [.mutableContainers])
    let resultArray = result as! NSMutableArray //->This should always work
    print(resultArray) //->shows output...
} catch {
    print(error)
}

Et data2:

-1

Et la comparaison:

do {
    let result = try JSONSerialization.jsonObject(with: data2)
    print(result)
} catch {
    print(error) //->Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
}

do {
    let result = try JSONSerialization.jsonObject(with: data2, options: [.allowFragments])
    print(result) //-> -1
} catch {
    print(error)
}
14
répondu OOPer 2016-10-15 11:44:13

Options: [] est un tableau vide renvoie rien.

alors que Options: [] peut aussi être modifié avec:

  • NSJSONWritingOptions: pour écrire des données JSON comme.

    • NSJSONWritingOptions.NSJSONWritingPrettyPrinted: spécifie que les données JSON doivent être générées avec des espaces conçus pour rendre la sortie plus lisible. Si cette option n'est pas définie, la représentation JSON la plus compacte possible est générer.
  • NSJSONReadingOptions: utilisé lors de la création d'objets de fondation à partir de données JSON.

    • NSJSONReadingOptions.MutableContainers: Spécifie que les tableaux et les dictionnaires sont créés comme des objets mutables.
    • .mutableLeaves: spécifie que les chaînes leaf dans le graphe d'objet JSON sont créées comme des instances de NSMutableString.
    • .allowFragments: spécifie que l'analyseur doit permettre les objets de premier niveau qui ne sont pas une instance de NSArray ou NSDictionary.
4
répondu vaibhav 2016-10-15 11:25:24