如何在对象 C 中解析具有多个实例的 JSON [重复]
Posted
技术标签:
【中文标题】如何在对象 C 中解析具有多个实例的 JSON [重复]【英文标题】:How to parse JSON with multiple instance in Object C [duplicate] 【发布时间】:2012-10-06 07:23:14 【问题描述】:可能重复:How to use NSJSONSerialization
我正在测试在 iphone 应用程序上使用我网站的网络服务。 有问题的 JSON 是:
[
"name": "Jason1",
"age": 20
,
"name": "Jason2",
"age": 40
,
"name": "Jason3",
"age": 60
]
还有我的代码:
NSData *jasonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost:3000/all_personal_information.json"]];
NSDictionary *json = nil;
if (jasonData)
json = [NSJSONSerialization JSONObjectWithData:jasonData options:kNilOptions error:nil];
代码在"name":"jason","age":20
下工作正常
我可以使用json[@"name"]
和json[@"age"]
获取值
但我不知道如何从有问题的 JSON 中获取值。
我尝试使用[json enumerateKeysAndObjectsWithOptions]
横穿字典。
但我会得到一个错误:
enumerateKeysAndObjectsWithOptions:usingBlock:]: 无法识别的选择器发送到实例 0x89b2490
但是当我将[json description]
登录到控制台时,我可以获得完整的 JSON。
【问题讨论】:
不是jason
,是JSON
。
jason 是我的名字,只是为了测试 :)
【参考方案1】:
把它放在一个数组中..例如
NSData *jasonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost:3000/all_personal_information.json"]];
NSDictionary *json = nil;
if (jasonData)
NSError *e = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:jasonData options:NSJSONReadingMutableContainers error: &e];
数组将包含您的
"name": "Jason1",
"age": 20
等在其各个索引中。当你想获取其中的值时,你可以使用下面的方法来获取值
NSDictionary *userName = [jsonArray objectAtIndex:1];
NSString *stringName = [userName valueForKey:@"name"];
【讨论】:
它很简单但是很有效:) 我没有记住返回类型是一个 id 指针。我一直认为返回类型是 NSDictionary。所以 NSDictionary 只是关于键值对。 NSArray 是关于任何对象的数组??? 是的..它很简单..很高兴我能帮上忙:) 你的意思是标记最佳答案吗?? 返回类型不完全是字典.. n 是.. 数组可以是任何对象..【参考方案2】:在获取数组的同时创建字典。如果您执行以下操作,它应该可以工作:
id json = nil;
if (jasonData)
json = [NSJSONSerialization JSONObjectWithData:jasonData options:kNilOptions error:nil];
if ([json isKindOfClass:NSArray.class])
for (id personDef in json)
if ([personDef isKindOfClass:NSDictionary.class])
NSDictionary * dict = (NSDictionary *) moduleDef;
NSString * name = [dict objectForKey:@"name" withClass:NSString.class];
NSLog(@"Person: @%", name);
在这里我做一些额外的检查对象是否是我们期望的。如果不是这种情况,您应该添加(正确的)错误处理。
【讨论】:
很好的尝试 :) 我希望我理解你的代码并修正了一些语法错误。但是我仍然无法完成任务。[链接]chopapp.com/#n5y1m9tk[link]。标签显示这不是 NSArray。 OOO我搞错了,我忘了打开我的服务器【参考方案3】:它会帮助你。
NSMutableDictionary *CompaintsAry =[NSJSONSerialization JSONObjectWithData:respo options:kNilOptions error:&error];
NSMutableArray *tempary =[[NSMutableArray alloc]init];
for (int i=0;i < [CompaintsAry count];i++)
CfResultFatch *rs = [[CfResultFatch alloc] initWithName:[[CompaintsAry obj ectAtIndex:i]objectForKey:@"Name"]
cipd :[[CompaintsAry objectAtIndex:i] objectForKey:@"Age"]];
[tempary addObject:rs];
cfComlaintsLists = [[NSMutableArray alloc] initWithArray:tempary];
SelectComplain = [[NSMutableArray alloc] initWithCapacity:[cfComlaintsLists count]];
[chiftab reloadData];
【讨论】:
注意,这里有 4 个未发布的对象。 我没有测试它,因为我不知道CfResultFatch是什么。不过谢谢你的回答:) 什么是CfResultFatch
?使用 Google,我无法找到任何有用的此类参考,甚至无法找到选择器 initWithName:cipd:
,尽管我在其他网站上找到了类似的示例代码。以上是关于如何在对象 C 中解析具有多个实例的 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swifty 动态创建具有多个键和值的 json 对象