使用 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

iPhone ASIHTTPRequest 从 requestFinished 方法中异步提取响应

覆盖 ASIHTTPRequest 的方法

ASIHttpRequest 可达性版本

在 iPhone 设备中下载文件

使用 ASIHTTPRequest 下载 plist 只能部分工作