如何从重复键的json获取值?

时间:2014-05-27 17:01:20

标签: objective-c json parsing key

我找了很长时间才得到答案但找不到任何东西。也许是因为我不知道如何问这个问题,因为我是json的新手。基本上我是一个新的ios开发人员,我正在尝试学习如何访问和使用json数据。下面是我正在使用的json的一部分:

{
"status": null,
"data": {
    "1088": {
        "nid": "1088",
        "title": "RE 1 (2000)",
        "articles": [
            {
                "nid": "2488",
                "title": "Copyright Page"
            },
...

我的困惑是有两个值为title的图层。所以,当我使用类似的东西时 self.dict = [self getDictionaryFromJson];并将json保存在字典中,然后我去使用 self.mainTitle = [self.dict objectForKey:@"title"];它会假定给我回RE 1 (2000)。但是我还想找回Copyright Page的次要头衔,那么我会做self.secondaryTitle = [self.dict objectForKey:@"title"]; ???

无论如何,我的困惑是我会认为它会再次给我回RE 1 (2000),因为呼叫没有变化,因此我不知道如何使用相同的密钥访问下一个项目。

也许我确信解决方案很简单我只是不太明白我需要做什么。

2 个答案:

答案 0 :(得分:1)

您发布的JSON包含嵌套数组(用方括号[]表示)和字典(用大括号{}表示)。您可以使用NSDictionary

将JSON转换为NSJSONSerialization
NSData *data = ... // Get JSON Data
self.dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
self.mainTitle = [[[self.dict objectForKey:@"data"] objectForKey:@"1088"] objectForKey:@"title"]
self.secondaryTitle = [[[[[self.dict objectForKey:@"data"] objectForKey:@"1088"] objectForKey:@"articles"] objectAtIndex:0] objectForKey:@"title"]

有关JSON的更多信息,您可以read the spec

答案 1 :(得分:1)

您忽略了映射到dict的数据的层次结构 - 记录它以进行检查。

所以,要获得第一个标题(RE 1(2000)),你会这样做:

NSString *title = [self.dict valueForKeyPath:@"data.1088.title"];

向下钻取JSON中的级别(以及字典)。同样的方法适用于更深层次的嵌套项目(尽管你不能总是使用valueForKeyPath:,因为它不会对数组做出你期望的事情......)。