webentwicklung-frage-antwort-db.com.de

Wie deserialisiere ich eine JSON-Zeichenfolge in ein NSDictionary? (Für iOS 5+)

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\"}"

Ich habe den folgenden Ansatz ausprobiert:

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

Aber es wirft einen Laufzeitfehler auf. Was mache ich falsch?

-[__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

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];
323
Abizern
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.

36
Desert Rose

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]);
5
Hemang

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 json​Object(with:​options:​), um eine JSON-Zeichenfolge in ein Wörterbuch zu deserialisieren.


# 1. Swift 4 Lösung

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)
    }
}

# 2. Swift 3 und Swift 4 Lösung

Mit Swift 3 und Swift 4, JSONSerialization hat eine Methode namens json​Object(with:​options:​) . json​Object(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 json​Object(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)
    }
}
4
Imanou Petit

Mit Abizern Code für Swift 2.2

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