2013-04-29 7 views
-1

Я играю с парсером JSON в iOS.json parsing in iOS

Но я был удивительно, как можно было бы на самом деле разобрать что-то (немного) более сложным, мои JSON показывает данные, как это:

"terms":"3", 
"results": 
{ 
    "Events":[ 
    { 
    "Event_Name":"3 Doors Down", 
    "Event_NavigateURL":"3-doors-down" 
    }, 
    { 
    "Event_Name":"Alabama 3", 
    "Event_NavigateURL":"alabama-3" 
    }, 
    { 
    "Event_Name":"Belsonic 2013", 
    "Event_NavigateURL":"belsonic-2013" 
    }, 
    { 
    "Event_Name":"Download Festival 2013", 
    "Event_NavigateURL":"download-festival-2013" 
    } 
], 
"Sports":{ 
}, 
"Venues":{ 
} 
} 

Я хочу, чтобы принести значение Event_Name, и хотите сохранить его в Tableview , Как я должен это получить?

Я попытался это, но не сделал этот успех я получаю SIGABRT ... (NSInvalidArgumentException),

cell.textLabel.text = [[[[arr objectAtIndex:indexPath.row] objectAtIndex:@"results"] objectForKey:@"Events"] objectForKey:@"Event_Name"]; 

Спасибо заранее ...

+0

Прежде всего, ваш JSON недействителен –

ответ

2

Для отображения имен событий в TableView ваш массив должен хранить объекты событий, получать события из JSON в массив как-

arr = [[JSONObject objectForKey:@“results”] objectForKey:@“Events”]; 

// and set cell text label as - 

cell.textLabel.text =[[arr objectAtIndex:indexPath.row] objectForKey:@"Event_Name"]; 
-1

включает работу первого кадра в формате JSON .. http://longweekendmobile.com/2010/10/15/how-to-consume-json-or-xml-web-apis-on-iphone-smoothly/, а затем следует:

NSError *error; 
     SBJSON *json = [SBJSON new]; 
     NSDictionary *dict_item = [json objectWithString:resp_str error:&error]; 

     if (dict_item == nil) 
      NSLog(@"%@", [NSString stringWithFormat:@"JSON parsing failed: %@", [error localizedDescription]]); 
     else 
      NSLog(@"items selected is : %@", dict_item); 

Необходимо проверить погоду, чтобы он возвращал массив или словарь .. (фактический тип возврата i s идентификатор) ..

, а затем в этом случае вы можете в конечном итоге получить значение имени события

+2

Не пробуйте использовать SBJSON это медленнее, чем родной API. – Fogmeister

+0

я могу разобрать мои данные JSON, вот мой выход из моего журнала: '{ "термины": "3", "Результаты": { "События": [ { "EVENT_NAME":" 3 Doors Down», "Event_NavigateURL": "3-дверь-вниз" }, { "EVENT_NAME": "Alabama 3", "Event_NavigateURL": "Алабама 3" }, { "EVENT_NAME" : "belsonic 2013", "Event_NavigateURL": "belsonic-2013" }, { "EVENT_NAME": "Download Festival 2013", "Event_NavigateURL": "скачать-фестиваль-2013" } ], "Спорт": { }, "Место": []} } ' – Krunal

+0

да у нас есть собственные встроенные в классах для JSon разбора в ИО в эти дни .. но я был предлагая Простой способ. – Rakesh

1

попробовать, как это может быть it'l помогает вам,

NSArray *array=[[[jsonarray objectAtIndex:0] valueForKey:@"results"] valueForKey:@"Events"]; 
    NSString *name=[[array objectAtIndex:indexPath.row] valueForKey:@"Event_Name"]; 
1

попробуйте включить

cell.textLabel.text = [[[[arr objectAtIndex:indexPath.row] objectAtIndex:@"results"] objectForKey:@"Events"] objectForKey:@"Event_Name"]; 

в

cell.textLabel.text = [[[[yourJsonDict objectForKey:@"results"] objectForKey:@"Events"] objectAtIndex:indexpath.row] objectForKey:@"Event_Name"]; 
+0

'[arr objectForKey: @" results "]' показывает ошибку – Krunal

+0

oh да, это массив ... замените 'arr' на имя вашего Json Dictionary – gasparuff

+0

Thanx для ответа, но такую ​​же ошибку .. – Krunal

3

Прежде всего ваш json недействителен. Если вы положите '{' в начало и '}' в конце, тогда это будет действительно. Во-вторых, вы должны использовать онлайн-парсинг-сайты json, чтобы узнать, действительно ли ваши строки json или нет. Попробуйте http://jsonviewer.stack.hu/

И для разбора Json используйте NSJSONSerialization NSJSON Kit. Перейти к этому сообщению, как его использовать. How to use NSJSONSerialization

Объекты в {} скобках означают, что это NSDictionary. Объект и объекты внутри [] означает, что они являются частью объекта NSArray.

+0

Всегда ищите объекты массива и объекты словаря внутри ваших строк json. Если вы обращаетесь к ним по-разному, ваше приложение будет аварийно завершено. –

+0

Как этот JSON недействителен? – Anupdas

+0

строки jsons начинаются с [] скобок или {} скобок, что означает либо объект типа NSS или тип NSDictionary соответственно. В вашем случае ваша строка имеет пары значений ключа, что означает объект NSDictionary. Итак, для этого допустимый json должен содержать {в начале и} в конце строки, показывающей открытие и окончание словарного объекта –

0

Вышеупомянутый недействительный JSON (если выше - полный отклик). Используйте jsonLint.com для проверки.

Вы можете попробовать это:

arr = [NSMutableArray arrayWithCapacity:[[dic objectForKey:@"Events"] count]]; 

for (NSDictionary *details in [dic objectForKey:@"Events"]){ 
[arr addObject:[details objectForKey:@"Event_Name"]]; 

} 

затем дать arr в качестве вклада в UITableview

1

Лучшая практика заключается в Видеть структуру JSON в Ссылка: http://json.bloople.net/.

Вставьте свой ответ JSON, и вы найдете нужную структуру.

Ваша структура JSON похожа: Массив словаря. Итак, используйте код ниже для хранения данных в массиве.

id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 

    arr = [[jsonObject objectForKey:@“results”] objectForKey:@“Events”]; 

Используйте приведенный ниже код, чтобы показать данные в Tableview.

cell.textLabel.text =[[arr objectAtIndex:indexPath.row] objectForKey:@"Event_Name"]; 
0

Вы можете сохранить корневой объект и получить данные по своему усмотрению. Получите доступ к данным за слоем. Если вы хотите показывать события, вы можете создать массив для событий, чтобы вы могли повторять шаги снова и снова.

@property (nonatomic, strong) NSDictionary *json; 
@property (nonatomic, strong) NSArray *events; 

NSError *error = nil; 
self.json = [NSJSONSerialization JSONObjectWithData:responseData 
                options:NSJSONReadingAllowFragments 
                 error:&error]; 
NSDictionary *results = self.json[@"results"]; 
self.events = results[@"Events"]; 

//Access each event in events array and get the event name 
NSDictionary *event = self.events[0]; 
NSString *eventName = event[@"Event_Name"];