web-dev-qa-db-fra.com

Comment désérialiser une chaîne JSON dans un NSDictionary? (Pour iOS 5+)

Dans mon application iOS 5, j'ai un NSString qui contient une chaîne JSON. Je souhaite désérialiser cette représentation de chaîne JSON en un objet natif NSDictionary.

 "{\"password\" : \"1234\",  \"user\" : \"andreas\"}"

J'ai essayé l'approche suivante:

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:@"{\"2\":\"3\"}"
                                options:NSJSONReadingMutableContainers
                                  error:&e];  

Mais cela jette une erreur d'exécution. Qu'est-ce que je fais mal?

-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c'
150
Andreas

On dirait que vous passez un paramètre NSString où vous devriez passer un paramètre NSData:

NSError *jsonError;
NSData *objectData = [@"{\"2\":\"3\"}" dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData
                                      options:NSJSONReadingMutableContainers 
                                        error:&jsonError];
323
Abizern
NSData *data = [strChangetoJSON dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data
                                                             options:kNilOptions
                                                               error:&error];

Par exemple, vous avez un NSString avec des caractères spéciaux dans NSString strChangetoJSON. Ensuite, vous pouvez convertir cette chaîne en réponse JSON en utilisant le code ci-dessus.

36
Desert Rose

J'ai créé une catégorie à partir de @Abizern answer

@implementation NSString (Extensions)
- (NSDictionary *) json_StringToDictionary {
    NSError *error;
    NSData *objectData = [self dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error];
    return (!json ? nil : json);
}
@end

Utilisez-le comme ça,

NSString *jsonString = @"{\"2\":\"3\"}";
NSLog(@"%@",[jsonString json_StringToDictionary]);
5
Hemang

Avec Swift 3 et Swift 4, String a une méthode appelée data(using:allowLossyConversion:) . data(using:allowLossyConversion:) a la déclaration suivante:

func data(using encoding: String.Encoding, allowLossyConversion: Bool = default) -> Data?

Renvoie une donnée contenant une représentation de la chaîne encodée à l'aide d'un encodage donné.

Avec Swift 4, vous pouvez utiliser data(using:allowLossyConversion:) de String avec decode(_:from:) de JSONDecoder afin de désérialiser une chaîne JSON dans un dictionnaire.

De plus, avec Swift 3 et Swift 4, le data(using:allowLossyConversion:) de String peut également être utilisé en conjonction avec la json​Object(with:​options:​) de JSONSerialization afin de désérialiser une chaîne JSON dans un dictionnaire. .


#1. Swift 4 solution

Avec Swift 4, JSONDecoder a une méthode appelée decode(_:from:) . decode(_:from:) a la déclaration suivante:

func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable

Décode une valeur de niveau supérieur du type donné à partir de la représentation JSON donnée.

Le code de Playground ci-dessous montre comment utiliser data(using:allowLossyConversion:) et decode(_:from:) afin d'obtenir un Dictionary à partir d'un fichier JSON formaté String:

let jsonString = """
{"password" : "1234",  "user" : "andreas"}
"""

if let data = jsonString.data(using: String.Encoding.utf8) {
    do {
        let decoder = JSONDecoder()
        let jsonDictionary = try decoder.decode(Dictionary<String, String>.self, from: data)
        print(jsonDictionary) // prints: ["user": "andreas", "password": "1234"]
    } catch {
        // Handle error
        print(error)
    }
}

# 2. Swift 3 et Swift 4 solution

Avec Swift 3 et Swift 4, JSONSerialization a une méthode appelée json​Object(with:​options:​) . json​Object(with:​options:​) a la déclaration suivante:

class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any

Renvoie un objet Foundation à partir de données JSON données.

Le code de Playground ci-dessous montre comment utiliser data(using:allowLossyConversion:) et json​Object(with:​options:​) afin d'obtenir un Dictionary à partir d'un fichier JSON formaté String:

import Foundation

let jsonString = "{\"password\" : \"1234\",  \"user\" : \"andreas\"}"

if let data = jsonString.data(using: String.Encoding.utf8) {
    do {
        let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String : String]
        print(String(describing: jsonDictionary)) // prints: Optional(["user": "andreas", "password": "1234"])
    } catch {
        // Handle error
        print(error)
    }
}
4
Imanou Petit

Utilisation du code Abizern pour Swift 2.2

let objectData = responseString!.dataUsingEncoding(NSUTF8StringEncoding)
let json = try NSJSONSerialization.JSONObjectWithData(objectData!, options: NSJSONReadingOptions.MutableContainers)
2
IOS Singh