2013-04-29 107 views
-1

我正在玩iOS中的JSON解析器。json在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价值,并希望将其存储在泰伯维,我应该如何获取?

我想这一点,但没有成功,我得到SIGABRT ... (NSInvalidArgumentException)

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

在此先感谢...

+0

首先,你的JSON是无效的 – 2013-04-29 09:39:46

回答

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的ID)..

,然后用这种方式,你可以最终得到的事件名称的值

+2

不要打扰使用SBJSON它比本地apis慢。 – Fogmeister 2013-04-29 09:43:07

+0

我能够解析我的JSON数据,这里是我的我的日志输出:'{ “术语”: “3”, “成果”:{ “事件”: { “EVENT_NAME”:“3门下来”, “Event_NavigateURL”: “3门向下” }, { “EVENT_NAME”: “阿拉巴马州3”, “Event_NavigateURL”: “阿拉巴马州-3” }, { “EVENT_NAME” :“Belsonic 2013”​​, “Event_NavigateURL”:“belsonic-2013”​​ }, { “Event_Name”:“Download Festival 2013”​​, “Event_NavigateURL”:“download-festival-2013”​​ } ], “体育”:{} , “场地”:[] } }' – Krunal 2013-04-29 09:44:06

+0

是的,我们都在内置类中的ios这些天JSON解析有自己的..但我所建议的最简单的方法.. – Rakesh 2013-04-29 09:44:43

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:@“结果”]'显示错误 – Krunal 2013-04-29 09:47:13

+0

哦是啊,它是一个数组...用你的Json字典的名称替换'arr' – gasparuff 2013-04-29 09:49:41

+0

Thanx用于回答但是同样的错误.. – Krunal 2013-04-29 09:53:26

3

首先你的json是无效的。如果你在开始时加入'{',并在结尾加上'}',那么它就是有效的。 其次,你应该使用在线json解析网站来查看你的json字符串是否有效。尝试http://jsonviewer.stack.hu/

而对于json解析使用NSJSONSerialization的NSJSON套件。 转到这篇文章如何使用它。 How to use NSJSONSerialization

{}括号中的对象表示它是一个NSDictionary对象,[]内的对象表示它们是NSArray对象的一部分。

+0

总是在你的json字符串中寻找数组对象和字典对象。如果你访问它们的方式不同,你的应用程序肯定会崩溃。 – 2013-04-29 09:49:37

+0

那个JSON是如何失效的? – Anupdas 2013-04-29 11:17:58

+0

jsons字符串以[]括号或{}括号开头,表示它分别是NSArray类型json或NSDictionary类型对象。 在你的情况下,你的字符串有键值对,这意味着它是一个NSDictionary对象。所以,为此,有效的json必须包含{开头和结尾处的字符串,以显示字典对象的开头和结尾 – 2013-04-29 11:30:49

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