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.
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 collecteNSArray
/NSDictionary
mutable -> NSMutableArray
/NSMutableDictionary
NSJSONReadingMutableContainers
option ou les chaînes de valeur -> NSMutableString
NSJSONReadingMutableLeaves
.
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).
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 NSArray
ou NSDictionary
s contenues dans le résultat doit être NSMutableArray
ou 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 NSString
s 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)
}
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.