In meiner iOS 5-App habe ich ein NSString
, das eine JSON-Zeichenfolge enthält. Ich möchte diese JSON-Zeichenfolgendarstellung in ein systemeigenes NSDictionary
-Objekt deserialisieren.
"{\"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'
Anscheinend übergeben Sie einen NSString
-Parameter, an den Sie einen NSData
-Parameter übergeben sollten:
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];
Zum Beispiel haben Sie ein NSString
mit Sonderzeichen in NSString
strChangetoJSON. Anschließend können Sie diese Zeichenfolge mithilfe des obigen Codes in eine JSON-Antwort konvertieren.
Ich habe eine Kategorie aus @Abizern Antwort gemacht
@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
Benutze es so,
NSString *jsonString = @"{\"2\":\"3\"}";
NSLog(@"%@",[jsonString json_StringToDictionary]);
Mit Swift 3 und Swift 4, String
hat eine Methode namens data(using:allowLossyConversion:)
. data(using:allowLossyConversion:)
hat die folgende Deklaration:
func data(using encoding: String.Encoding, allowLossyConversion: Bool = default) -> Data?
Gibt Daten zurück, die eine Darstellung des mit einer bestimmten Codierung codierten Strings enthalten.
Mit Swift 4, String
's data(using:allowLossyConversion:)
kann in Verbindung mit JSONDecoder
' s decode(_:from:)
verwendet werden, um a zu deserialisieren JSON-Zeichenfolge in ein Wörterbuch.
Darüber hinaus kann mit Swift 3 und Swift 4, String
's data(using:allowLossyConversion:)
auch in Verbindung mit JSONSerialization
's jsonObject(with:options:)
, um eine JSON-Zeichenfolge in ein Wörterbuch zu deserialisieren.
Mit Swift 4 hat JSONDecoder
eine Methode namens decode(_:from:)
. decode(_:from:)
die folgende Deklaration:
func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable
Dekodiert einen Wert der obersten Ebene des angegebenen Typs aus der angegebenen JSON-Darstellung.
Der folgende Playground-Code zeigt, wie data(using:allowLossyConversion:)
und decode(_:from:)
verwendet werden, um ein Dictionary
von einem JSON-formatierten String
zu erhalten:
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)
}
}
Mit Swift 3 und Swift 4, JSONSerialization
hat eine Methode namens jsonObject(with:options:)
. jsonObject(with:options:)
hat die folgende Deklaration:
class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any
Gibt ein Foundation-Objekt aus angegebenen JSON-Daten zurück.
Der folgende Playground-Code zeigt, wie data(using:allowLossyConversion:)
und jsonObject(with:options:)
verwendet werden, um ein Dictionary
von einem JSON-formatierten String
zu erhalten:
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)
}
}
Mit Abizern Code für Swift 2.2
let objectData = responseString!.dataUsingEncoding(NSUTF8StringEncoding)
let json = try NSJSONSerialization.JSONObjectWithData(objectData!, options: NSJSONReadingOptions.MutableContainers)