使用 Asihttprequest 和 iPhone 的 Json 框架解析 JSON 数据
Posted
技术标签:
【中文标题】使用 Asihttprequest 和 iPhone 的 Json 框架解析 JSON 数据【英文标题】:Parse JSON data using Asihttprequest and the Json framework for iphone 【发布时间】:2011-08-07 16:21:00 【问题描述】:我一直在学习如何使用 JSON 框架和 ASIHTTPRequest for ios 解析 JSON。我已经通过社区教程使用 twitter 提要和自定义提要进行了测试。一切顺利。
然后我想我会使用 Microsoft Odata Service for Northwind db 进行测试。您可以在此处查看 json 结果:
http://jsonviewer.stack.hu/#http://services.odata.org/Northwind/Northwind.svc/Products%281%29?$format=json
现在我一直在努力研究如何仅解析产品名称。谁能指出我正确的方向?
根据我的要求完成我有这个:
- (void)requestFinished:(ASIHTTPRequest *)request
[MBProgressHUD hideHUDForView:self.view animated:YES];
NSString *responseString = [request responseString];
NSDictionary *responseDict = [responseString JSONValue];
//find key in dictionary
NSArray *keys = [responseDict allKeys];
NSString *productName = [responseDict valueForKey:@"ProductName"];
NSLog(@"%@",productName);
在日志中我有 null。
如果我将 valueforKey 更改为 @"d"
,我会得到整个有效负载,但我只想要 productName。
我使用的服务网址是:
http://servers.odata.org/Northwind/Northwind.svc/Products(1)?$format=json
【问题讨论】:
【参考方案1】:根据the link you have provided,您的 JSON 格式如下:
"d":
...
"ProductName": "Chai",
...
在顶层,您只有一个键:"d"
。如果你这样做:
NSString *productName = [responseDict valueForKey:@"ProductName"];
它将返回nil
。您需要深入了解层次结构:
NSDictionary *d = [responseDict valueForKey:@"d"];
NSString *productName = [d valueForKey:@"ProductName"];
或者简单地说:
NSString *productName = [responseDict valueForKeyPath:@"d.ProductName"];
【讨论】:
正确。这种将响应包装在外部级别“d”中似乎是常见的 .net / Microsoft 事情。 完美!非常感谢,是的,包裹在 d 中很奇怪。 快速更新 - 我已经切换到使用 JSONkit 并且上面给了我 null。有什么想法吗? 我已经通过使用 LOG 语句检查了我的 json 是否正确返回,一切看起来都和以前一样,但我没有得到以下信息 - json 与上面相同 好的 - 我必须用 jsonkit NSString *productName = [responseDict valueForKeyPath:@"d.results.ProductName"];以上是关于使用 Asihttprequest 和 iPhone 的 Json 框架解析 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章
ASIHTTPRequest setPostValue iPhone