Konvertieren von NSString in NSDictionary / JSON


83

Ich habe folgende Daten gespeichert als NSString:

 {
    Key = ID;
    Value =         {
        Content = 268;
        Type = Text;
    };
},
    {
    Key = ContractTemplateId;
    Value =         {
        Content = 65;
        Type = Text;
    };
},

Ich möchte diese Daten in Daten konvertieren, NSDictionarydie die Schlüsselwertpaare enthalten.

Ich versuche zuerst, das NSStringin ein JSON- Objekt wie folgt zu konvertieren :

 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

Wenn ich jedoch versuche:

NSString * test = [json objectForKey:@"ID"];
NSLog(@"TEST IS %@", test);

Ich erhalte den Wert als NULL.

Kann jemand vorschlagen, was das Problem ist?


1
Bitte beachten Sie, dass hier in der angegebenen JSON-Zeichenfolge "ID" ein Wert und kein Schlüssel ist.
Sunil Zalavadiya

NSLog (@ "JSON IS% @", json); ??????
Prasad G

Antworten:


258

Ich glaube, Sie interpretieren das JSON-Format für Schlüsselwerte falsch. Sie sollten Ihre Zeichenfolge als speichern

NSString *jsonString = @"{\"ID\":{\"Content\":268,\"type\":\"text\"},\"ContractTemplateID\":{\"Content\":65,\"type\":\"text\"}}";
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

Wenn Sie nun der NSLog-Anweisung folgen

NSLog(@"%@",[json objectForKey:@"ID"]);

Ergebnis wäre ein anderes NSDictionary.

{
    Content = 268;
    type = text;
}

Ich hoffe, dies hilft, ein klares Verständnis zu bekommen.


1
Keine wirkliche Antwort auf die Frage, da Sie der Person sagen, dass sie ihre Zeichenfolge neu formatieren soll. In einigen Fällen (z. B. IAP-Belege im iOS6-Format) erhalten Sie eine Zeichenfolge in diesem Format.
Chris Prince

1
Es steht Ihnen jederzeit frei, die Antworten auch auf die Fragen zu posten, die Antworten akzeptiert haben. Beeilen Sie sich also und veröffentlichen Sie Ihre Version der Antwort und wenden Sie sich an OP, um eine Überarbeitung der akzeptierten Antwort in Betracht zu ziehen. :)
Janak Nirmal

1
BTW OP hat JSON gepostet? Bist du dir da sicher? Bitte überprüfen Sie die Anforderungen von OP und ist es möglich, innerhalb dieses Formats zu erreichen? Wenn ja, beantworte die Frage und ich werde abstimmen und ein neues Kopfgeld erstellen und es dir vergeben.
Janak Nirmal

14

Ich denke, Sie erhalten das Array von der Antwort, also müssen Sie dem Array eine Antwort zuweisen.

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData: [string dataUsingEncoding: NSUTF8StringEncoding] Optionen: NSJSONReadingMutableContainers Fehler: & err];
NSDictionary * dictionary = [array objectAtIndex: 0]; 
NSString * test = [Wörterbuch objectForKey: @ "ID"];
NSLog (@ "Test ist% @", Test);

6

Verwenden Sie diesen Code, wobei str Ihre JSON-Zeichenfolge ist:

NSError *err = nil;
NSArray *arr = 
 [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:NSJSONReadingMutableContainers 
                                   error:&err];
// access the dictionaries
NSMutableDictionary *dict = arr[0];
for (NSMutableDictionary *dictionary in arr) {
  // do something using dictionary
}

[arr count] gibt Null zurück.
GuybrushThreepwood

FEHLER ist Fehlerdomäne = NSCocoaErrorDomain Code = 3840 "Der Vorgang konnte nicht abgeschlossen werden. (Cocoa-Fehler 3840.)" (JSON-Text wurde nicht mit Array oder Objekt und Option zum Zulassen nicht festgelegter Fragmente gestartet.) UserInfo = 0x1f5b3660 {NSDebugDescription = JSON-Text begann nicht mit Array oder Objekt und Option, um Fragmente nicht gesetzt zu lassen.}
GuybrushThreepwood

Etwas ist in Ihren JSON-Daten fehlerhaft
Woodstock

2

Swift 3:

if let jsonString = styleDictionary as? String {
    let objectData = jsonString.data(using: String.Encoding.utf8)
    do {
        let json = try JSONSerialization.jsonObject(with: objectData!, options: JSONSerialization.ReadingOptions.mutableContainers) 
        print(String(describing: json)) 

    } catch {
        // Handle error
        print(error)
    }
}

0

Verwenden Sie den folgenden Code, um das Antwortobjekt aus dem AFHTTPSessionManagerFehlerblock abzurufen. Anschließend können Sie den generischen Typ in den erforderlichen Datentyp konvertieren:

id responseObject = [NSJSONSerialization JSONObjectWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] options:0 error:nil];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.