【问题标题】:Parsing nested JSON objects with JSON Framework for Objective-C使用 JSON Framework for Objective-C 解析嵌套的 JSON 对象
【发布时间】:2011-01-25 17:53:00
【问题描述】:

我有以下 JSON 对象:

{
"response": {
    "status": 200
},
"messages": [
    {
        "message": {
            "user": "value"
            "pass": "value",
            "url": "value"
         }
 ]
    }

}

我正在使用 JSON-Framework(也尝试过 JSON Touch)来解析它并创建一个字典。我想访问“message”块并提取“user”、“pass”和“url”值。

在 Obj-C 中我有以下代码:

// Create new SBJSON parser object
SBJSON *parser = [[SBJSON alloc] init];

// Prepare URL request to download statuses from Twitter
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:myURL]]; 

// Perform request and get JSON back as a NSData object
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// Get JSON as a NSString from NSData response
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

//Print contents of json-string
NSArray *statuses = [parser objectWithString:json_string error:nil];
NSLog(@"Array Contents: %@", [statuses valueForKey:@"messages"]);
NSLog(@"Array Count: %d", [statuses count]);


NSDictionary *results = [json_string JSONValue];
NSArray *tweets = [[results objectForKey:@"messages"] objectForKey:@"message"];

for (NSDictionary *tweet in tweets)
{
    NSString *url = [tweet objectForKey:@"url"];
    NSLog(@"url is: %@",url);
}

我可以提取“消息”并查看所有“消息”块,但我无法更深入地解析并提取“用户”、“通过”和“网址”。

【问题讨论】:

  • json 字符串格式不正确,就像你在这里写的那样。消息数组有两个左花括号,只有一个右花括号。

标签: objective-c iphone cocoa-touch xcode json


【解决方案1】:

已解决:

NSArray *tweets = [[results objectForKey:@"messages"] valueForKey:@"message"];

【讨论】:

  • 你能再解释一下这个答案吗?
【解决方案2】:
Array({

  0=>Dictionary({

      response =  Array({

        0=>Dictionary(Status = 200)

      })

    }),

  1=>Dictionary({

      messages = Array({

        0=> Dictionary({

          message = Array({

            0=>Dictionary({

              user = value,

              pass=value,

                 url=value

            })

          })

        })

      })

  })

})

所以,要访问用户的字典,pass,url,

nsarray *arr = jsonmainarray;


arr = [[[jsonmainarray objectAtIndex: 1] objectforkey:@"messages"] objectatindex: 0];



nsdictionary *dict = [arr objectatindex: 0];

arr = [dict objectforkey:@"message"];

dict = [arr objectatindex: 0]; // Dictionary with user, pass, url

【讨论】:

    【解决方案3】:

    有一种更简单的方法(在我看来)进行 JSON 解析:)

    - (void)loadJSONData:(NSString *)u{
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://expandurl.appspot.com/expand?url=%@", u]];
        NSData *rawJsonData = [NSData dataWithContentsOfURL:url];
    
        CJSONDeserializer *parser = [CJSONDeserializer new];
        NSError *error;
        NSDictionary *jsonDictionary = [parser deserializeAsDictionary:rawJsonData error:&error];
    
        [parser release];
    
        NSArray *array = [jsonDictionary objectForKey:@"urls"]; 
    }
    

    你所要做的就是使用 JSON touch...就像 Sheehan Alam 提到的那样。

    假设你得到了这行 JSON 数据:

    { "end_url" = "http://www.youtube.com"; 重定向= 0; "start_url" = "http://www.youtube.com"; 状态=确定; 网址 = ( “http://www.youtube.com” ); }

    然后在您的 JSONDictonary 中,可以通过以下方式访问数据:

    [jsonDictionary objectForKey:@"urls"]; //This will return an Array since URLS is a array
    [jsondictionary objectForKey:@"en_url"]; //this will return an NSString since end_url is a string
    

    希望这能像它帮助我一样帮助人们 =)

    真诚的 克里斯蒂安

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多