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\"}"
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:@"{\"2\":\"3\"}"
options:NSJSONReadingMutableContainers
error:&e];
-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c'
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];
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.
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]);
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 jsonObject(with:options:)
de JSONSerialization
afin de désérialiser une chaîne JSON dans un dictionnaire. .
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)
}
}
Avec Swift 3 et Swift 4, JSONSerialization
a une méthode appelée jsonObject(with:options:)
. jsonObject(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 jsonObject(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)
}
}
Utilisation du code Abizern pour Swift 2.2
let objectData = responseString!.dataUsingEncoding(NSUTF8StringEncoding)
let json = try NSJSONSerialization.JSONObjectWithData(objectData!, options: NSJSONReadingOptions.MutableContainers)