iOS中的json解析[关闭]

Posted

技术标签:

【中文标题】iOS中的json解析[关闭]【英文标题】:json parsing in iOS [closed] 【发布时间】:2013-04-29 09:35:39 【问题描述】:

我正在使用 ios 中的 JSON 解析器。

但我想知道如何真正解析(有点)更复杂的东西,我的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"];

提前致谢...

【问题讨论】:

首先,你的JSON无效 【参考方案1】:

首先你的 json 是无效的。如果你把''放在开头,''放在最后,那么它是有效的。 其次,您应该使用在线json解析网站来查看您的json字符串是否有效。试试http://jsonviewer.stack.hu/

对于 json 解析,使用 NSJSON Kit 的 NSJSONSerialization。 去这篇文章了解如何使用它。 How to use NSJSONSerialization

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

【讨论】:

始终在 json 字符串中查找数组对象和字典对象。如果您以不同的方式访问它们,您的应用肯定会崩溃.. 那个 JSON 怎么无效? jsons 字符串以 [ ] 括号或 括号开头,分别表示它是 NSArray 类型的 json 或 NSDictionary 类型的对象。在您的情况下,您的字符串具有键值对,这意味着它是一个 NSDictionary 对象。因此,为此,有效的 json 必须在字符串的开头包含 并在字符串结尾包含 ,以显示字典对象的开头和结尾 你是对的。由于 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"];

【讨论】:

【参考方案3】:

试试这样可能对你有帮助,

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

【讨论】:

【参考方案4】:

试着转

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

【讨论】:

[arr objectForKey:@"results"] 显示错误 哦,是的,它是一个数组...替换 arr 为您的 Json 字典的名称 感谢回答但同样的错误.. 编译错误?试着一步一步做。例如。继续做一个像NSLog(@"%@", [yourJsonDict objectForKey:@"results"]) 这样的NSLog,然后看看你得到了什么。然后做一个NSLog(@"%@", [[yourJsonDict objectForKey:@"results"] objectAtIndex:0]); 等等。【参考方案5】:

最佳实践是在链接中查看 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"];

【讨论】:

【参考方案6】:

以上不是有效的 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 的输入

【讨论】:

【参考方案7】:

您可以存储根对象并根据需要获取数据。逐层访问数据。如果要显示事件,可以为事件创建一个数组,这样就可以避免一次又一次地执行这些步骤。

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

【讨论】:

【参考方案8】:

首先包含 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);

你需要检查天气它返回一个数组或一个字典..(实际返回类型是 id)..

然后通过这种方式最终可以得到事件名称的值

【讨论】:

别费心使用 SBJSON,它比原生 api 慢。 我能够解析我的 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":[] 是的,这些天我们确实有自己的内置类,用于在 ios 中解析 json .. 但我建议的是最简单的方法 ..

以上是关于iOS中的json解析[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的特殊 JSON 解析 [关闭]

iOS - 托管 JSON 文件以使用 URL 解析它 [关闭]

在 iOS 应用程序中获取和解析 JSON 的最佳方法? [关闭]

ios中的Json值失败[关闭]

JSON解析错了吗? [关闭]

片段中的 JSON 解析 [关闭]