Konwersja NSString do NSDictionary / JSON

83

Mam następujące dane zapisane jako NSString:

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

Chcę przekonwertować te dane na plik NSDictionaryzawierający pary klucz-wartość.

Staram się najpierw przekonwertować NSStringDo JSON obiekty w następujący sposób:

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

Jednak kiedy próbuję:

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

Otrzymuję wartość jako NULL.

Czy ktoś może zasugerować w czym jest problem?

GuybrushThreepwood
źródło
1
Zwróć uwagę, że w podanym ciągu json „ID” jest wartością, a nie kluczem.
Sunil Zalavadiya
NSLog (@ "JSON IS% @", json); ??????
Prasad G,

Odpowiedzi:

259

Uważam, że błędnie interpretujesz format JSON dla wartości kluczowych. Powinieneś przechowywać swój ciąg jako

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];

Teraz, jeśli wykonasz instrukcję NSLog

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

Rezultatem byłby inny NSDictionary.

{
    Content = 268;
    type = text;
}

Mam nadzieję, że to pomoże uzyskać jasne zrozumienie.

Janak Nirmal
źródło
1
Właściwie nie jest to odpowiedź na pytanie, ponieważ każesz tej osobie sformatować swój ciąg. W niektórych przypadkach (np. Pokwitowania IAP w formacie iOS6) otrzymasz ciąg znaków w tym formacie.
Chris Prince,
1
Zawsze możesz zamieścić odpowiedzi nawet na pytania, na które zostały przyjęte. Więc pośpiesz się i opublikuj swoją wersję odpowiedzi i podejdź do OP, aby rozważyć zmianę zaakceptowanej odpowiedzi. :)
Janak Nirmal
1
BTW OP opublikował JSON? Jesteś pewien? Proszę sprawdzić wymagania OP i czy można to osiągnąć w tym formacie? Jeśli tak, odpowiedz na pytanie, a ja zagłosuję za i utworzę nową nagrodę i przyznam ją Tobie.
Janak Nirmal
14

Myślę, że otrzymujesz tablicę z odpowiedzi, więc musisz przypisać odpowiedź do tablicy.

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData: [string dataUsingEncoding: NSUTF8StringEncoding] opcje: NSJSONReadingMutableContainers błąd: & err];
NSDictionary * Dictionary = [tablica objectAtIndex: 0]; 
NSString * test = [słownik objectForKey: @ "ID"];
NSLog (@ "Test to% @", test);
MobileDev
źródło
6

Użyj tego kodu, gdzie str jest ciągiem JSON:

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
}
Woodstock
źródło
[arr count] zwraca zero.
GuybrushThreepwood
BŁĄD to Error Domain = NSCocoaErrorDomain Code = 3840 „Operacja nie mogła zostać zakończona. (Błąd Cocoa 3840.)” (Tekst JSON nie zaczynał się od tablicy lub obiektu, a opcja zezwalająca na fragmenty nie została ustawiona.) UserInfo = 0x1f5b3660 {NSDebugDescription = Tekst JSON nie zaczynał się od tablicy lub obiektu, a opcja zezwalająca na fragmenty nie została ustawiona.}
GuybrushThreepwood
coś jest źle sformułowane w danych json
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)
    }
}
Josh O'Connor
źródło
0

Użyj poniższego kodu, aby pobrać obiekt odpowiedzi z AFHTTPSessionManagerbloku błędu; następnie możesz przekonwertować typ ogólny na wymagany typ danych:

id responseObject = [NSJSONSerialization JSONObjectWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] options:0 error:nil];
krish2me
źródło