如何使用JSON框架和Objective-C/iPhone/Xcode解析嵌套的JSON对象?
我正在使用JSON框架编写一个iPhone本机应用程序 我的应用程序正在使用JSON访问web服务。我们发送的JSON数据具有嵌套对象,下面是提供的数据示例:如何使用JSON框架和Objective-C/iPhone/Xcode解析嵌套的JSON对象?,objective-c,iphone,xcode,json,Objective C,Iphone,Xcode,Json,我正在使用JSON框架编写一个iPhone本机应用程序 我的应用程序正在使用JSON访问web服务。我们发送的JSON数据具有嵌套对象,下面是提供的数据示例: { "model": { "JSONRESPONSE": { "authenticationFlag": true, "sessionId": "3C4AA754D77BFBE33E0D66EBE306B8CA", "statusMessage
{
"model": {
"JSONRESPONSE": {
"authenticationFlag": true,
"sessionId": "3C4AA754D77BFBE33E0D66EBE306B8CA",
"statusMessage": "Successful Login.",
"locId": 1,
"userName": "Joe Schmoe"
}
}
}
我在使用objectForKey和valueForKey NSDictionary方法解析时遇到问题。我不断收到invalidArgumentException运行时错误
例如,我想查询authenticationFlag元素的响应数据
谢谢,
迈克
西雅图如果没有更多的细节,例如您正在使用的JSON解析代码,很难说清楚,但我觉得有两件事是可能的: 您没有使用完整路径进行查询。在上述情况下,您需要首先获取封闭模型json响应,然后向json响应字典询问authenticationFlag值: [[jsonDict objectForKey:@model] objectForKey:@JSONRESPONSE]objectForKey:@authenticationFlag] 也许您使用的是c-strings而不是NSStrings@作为键,尽管这可能会导致崩溃或无法编译。密钥应该是可以转换为id的内容
虽然可能,但两者都可能是错误的,因此请提供更多细节。以下内容直接摘自丹·格里格斯比的教程——《请属性,偷窃是一种恶报》
NSString* aStr;
aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSDictionary *dictionary = [aStr JSONValue];
NSArray *keys = [dictionary allKeys];
// values in foreach loop
for (NSString *key in keys) {
NSArray *items = (NSArray *) [dictionary objectForKey:key];
for (id *item in items) {
NSString* aStrs= item;
NSLog(@" test %@", aStrs);
NSDictionary *dict = aStrs;
NSArray *k = [dict allKeys];
for (id *it in k) {
NSLog(@"the child item: %@", [NSString stringWithFormat:@"Child Item -> %@ value %@", (NSDictionary *) it,[dict objectForKey:it]]);
}
通过HTTP获取JSON
我们将使用Cocoa的NSURLConnection发出HTTP请求并检索JSON数据
Cocoa为发出HTTP请求提供了同步和异步选项。从应用程序的主runloop运行的同步请求会导致应用程序在等待响应时停止。异步请求使用回调来避免阻塞,并且使用起来非常简单。我们将使用异步请求
我们需要做的第一件事是更新视图控制器的接口,以包含一个NSMutableData来保存响应数据。我们在接口中声明它,而不是在方法中声明它,因为响应是以片段的形式返回的,我们将其缝合在一起,而不是以一个完整的单元的形式返回
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
IBOutlet UILabel *label;
NSMutableData *responseData;
}
这主要是样板代码,初始化responseData变量以准备保存数据,并启动viewDidload中的连接;它收集数据中的数据块;空连接IDFinishLoading随时准备对结果进行处理。
使用JSON数据
接下来,我们将充实ConnectiondFinishLoading方法,以利用上一步检索到的JSON数据
更新ConnectionIDFinishLoading方法:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSArray *luckyNumbers = [responseString JSONValue];
NSMutableString *text = [NSMutableString stringWithString:@"Lucky numbers:\n"];
for (int i = 0; i < [luckyNumbers count]; i++)
[text appendFormat:@"%@\n", [luckyNumbers objectAtIndex:i]];
label.text = text;
}
它制造了一个混乱。解析器非常灵活,可以返回适当匹配JSON数据类型和Objective-C数据类型的对象(包括嵌套对象)。
更好的错误处理
到目前为止,我们一直在使用方便的高级扩展NSString方法解析JSON。我们这样做有很好的理由:简单地将JSONValue消息发送到一个字符串以访问解析的JSON值非常方便
不幸的是,使用这种方法会使有用的错误处理变得困难。如果JSON解析器由于任何原因失败,它只返回一个nil值。但是,如果您在发生这种情况时查看控制台日志,您将看到确切描述导致解析器失败的原因的消息
如果能够将这些错误详细信息传递给用户,那就太好了。为此,我们将切换到JSON SDK支持的第二种面向对象方法
在以下位置更新ConnectiondFinishLoading方法:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSError *error;
SBJSON *json = [[SBJSON new] autorelease];
NSArray *luckyNumbers = [json objectWithString:responseString error:&error];
[responseString release];
if (luckyNumbers == nil)
label.text = [NSString stringWithFormat:@"JSON parsing failed: %@", [error localizedDescription]];
else {
NSMutableString *text = [NSMutableString stringWithString:@"Lucky numbers:\n"];
for (int i = 0; i < [luckyNumbers count]; i++)
[text appendFormat:@"%@\n", [viewcontroller objectAtIndex:i]];
label.text = text;
}
}
使用此方法可以为我们提供一个指向底层JSON解析器的错误对象的指针,我们可以使用该指针进行更有用的错误处理
结论:
JSON SDK和Cocoa对HTTP的内置支持使得将JSON web服务添加到iPhone应用程序变得简单。现在,Objective c在构建类中引入了JSON解析
NSError *myError = nil;
NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];
因此,利用这个类并使您的应用程序无错误…:解决方案1起作用。本质上,我需要遍历到JSONRESPONSE节点,然后才能访问所需的元素。谢谢我有这样的json格式,如何使用请帮助我。jsont{id:ntp-a1.nict.go.jp,it:1232963971.248,st:1344228610.961,leap:34,next:1341100800,步骤:1}
NSError *myError = nil;
NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];