如何使用JSON框架和Objective-C/iPhone/Xcode解析嵌套的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

我正在使用JSON框架编写一个iPhone本机应用程序

我的应用程序正在使用JSON访问web服务。我们发送的JSON数据具有嵌套对象,下面是提供的数据示例:

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