2016-02-16 3 views
0

У меня есть трудное время, пытаясь разобрать следующий массив json. Как разобрать его. Другие ответы в Интернете, похоже, не решают мою проблему.Как разбирать такой массив json?

{ 
    "status": 1, 
    "value": { 
    "details": [ 
     { 
     "shipment_ref_no": "32", 
     "point_of_contact": { 
      "empid": "" 
     }, 
     "products": { 
      "0": " Pizza" 
     },"status": "2" 
     }, 
     { 
     "shipment_ref_no": "VAPL/EXP/46/14-15", 
     "point_of_contact": { 
      "empid": "60162000009888" 
     }, 
     "products": { 
      "0": "MAIZE/CORN STARCH" 
     }, 
     "status": "5" 
     } 
    ] 
    } 
} 

Мне нужно получить доступ к значениям каждого из этих ключей.

Ниже мой код

NSString* pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding]; 

NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil]; 
NSArray *argsArray = [[NSArray alloc] initWithArray:[jsonDic objectForKey:@"details"]]; 
NSDictionary *argsDict = [[NSDictionary alloc] initWithDictionary:[argsArray objectAtIndex:0]]; 
NSLog(@"keys = %@", jsonDic[@"values"]); 
+0

Present код вы writted –

+0

Почему бы не использовать третью сторону библиотеку/стручок, чтобы помочь вам с разбором? – footyapps27

+1

Попробуйте заменить код кодом, предоставленным мной. –

ответ

2
NSString *pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding];  
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil]; 
NSArray *argsArray = [[NSArray alloc] initWithArray:[jsonDic objectForKey:@"details"]]; 

//argsArray holds objects in form of NSDictionary. 
for(NSDictionary *response in argsArray) { 
    //String object 
    NSLog(@"%@", [response valueForKey:@"shipment_ref_no"]); 
    //Dictionary object 
    NSLog(@"%@", [[response objectForKey:@"point_of_contact"] valueForKey:@"empid"]); 
    //String object 
    NSLog(@"%@", [response valueForKey:@"status"]); 
    //Dictionary object 
    NSLog(@"%@", [[response objectForKey:@"products"] valueForKey:@"0"]); 
} 

Я полагаю, вы, безусловно, должны спросить своего разработчика сервера для обновления отклика.

Кроме того, вы всегда можете использовать классы модели для анализа данных. Пожалуйста, проверьте это, How to convert NSDictionary to custom object.

И да, я использую сайт this, чтобы проверить свой ответ json.

1

EDIT: После ответа в JavaScript!

Вы можете разобрать данные JSON с:

var array = JSON.parse(data); 

, а затем вы можете получить все, как это:

var refno = array["value"]["details"][0]["shipment_ref_no"]; 
+0

'value' is а не массив в приведенном примере. – Avi

+0

да, спасибо. Но он думал, что хочет знать, как это сделать в javascript, поэтому мой ответ ошибочен в любом случае –

1
NSDictionary *response = //Your json 
NSArray *details = response[@"value"][@"details"] 

и т.д. Довольно легко

1

Обновить код следующим образом. Вы пытаетесь прочитать массив details с верхнего уровня, тогда как в ваших данных он находится внутри ключа value. Поэтому вы должны прочитать значение dict и в пределах этого читать массив данных.

NSString* pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil]; 
NSDictionary *valueDict = [jsonDic objectForKey:@"value"]; 
NSArray *argsArray = [[NSArray alloc] initWithArray:[valueDict objectForKey:@"details"]]; 
NSDictionary *argsDict = [[NSDictionary alloc] initWithDictionary:[argsArray objectAtIndex:0]]; 
NSLog(@"keys = %@", jsonDic[@"values"]); 
1

Я думаю, ваша проблема в том, что у вас есть:

NSLog(@"keys = %@", jsonDic[@"values"]); 

Но это должно быть:

NSLog(@"keys = %@", jsonDic[@"value"]); 
3

Это, как вы можете разобрать весь свой словарь:

NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

    NSArray *details = [[dataDictionary objectForKey:@"value"] objectForKey:@"details"]; 

    for (NSDictionary *dic in details) { 
     NSString *shipmentRefNo = dic[@"shipment_ref_no"]; 
     NSDictionary *pointOfContact = dic[@"point_of_contact"]; 
     NSString *empId = pointOfContact[@"empid"]; 

     NSDictionary *products = dic[@"products"]; 
     NSString *zero = products[@"0"]; 
     NSString *status = dic[@"status"]; 

    } 
2

можно разобрать, как ...

NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil]; 
NSDictionary *dictValue = [[NSDictionary alloc] initWithDictionary:[jsonDic objectForKey:@"value"]]; 

NSArray *arrDetails = [[NSArray alloc] initWithArray:[dictValue objectForKey:@"details"]]; 

for (int i=0; i<arrDetails.count; i++) 
{ 
    NSDictionary *dictDetails=[arrDetails objectAtIndex:i]; 
    NSDictionary *dictContact = [[NSDictionary alloc] initWithDictionary:[dictDetails objectForKey:@"point_of_contact"]]; 
    NSDictionary *dictProduct = [[NSDictionary alloc] initWithDictionary:[dictDetails objectForKey:@"products"]]; 
} 
1

Ниже приведен код для разбора JSON массива. Я использовал для анализа массива JSON из файла, но вы также можете сделать это, используя ссылку ответа. Я предоставил код для обоих и ниже.

// using file 
NSString *str = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"]; 
NSData *data = [[NSData alloc]initWithContentsOfFile:str]; 
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
NSMutableDictionary *dictValues = [[NSMutableDictionary alloc]initWithDictionary:[dict valueForKey:@"value"]]; 
NSMutableArray *array = [[NSMutableArray alloc]initWithArray:[dictValues valueForKey:@"details"] copyItems:YES]; 

NSLog(@"Array Details :- %@",array); 

// using url 
NSURL *url = [NSURL URLWithString:@"www.xyz.com"]; // your url 
NSData *data = [[NSData alloc]initWithContentsOfURL:url]; 
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
NSMutableDictionary *dictValues = [[NSMutableDictionary alloc]initWithDictionary:[dict valueForKey:@"value"]]; 
NSMutableArray *array = [[NSMutableArray alloc]initWithArray:[dictValues valueForKey:@"details"] copyItems:YES]; 

NSLog(@"Array Details :- %@",array); 
Смежные вопросы