在Objective-C中读取JSON文件

33

我已经搜索了大约两个小时,似乎没有人清楚地解释过如何在Objective C中读取JSON文件。

假设我有一个名为colors.json的JSON文件,看起来像这样:

{
    "colors": [{
        "name": "green",
        "pictures": [{
            "pic": "pic1.png",
            "name": "green1"
        }, {
            "pic": "pic2.png",
            "name": "green2"
        }]
    }, {
        "name": "yellow",
        "pictures": [{
            "pic": "pic3.png",
            "name": "yellow1"
        }]
    }]
}
  1. 我应该把这个文件复制到哪里才能在我的XCode路径中使用?

  2. 如何以编程方式获取此文件?

  3. 获取此文件后,如何读取每个colors对象的name值?

  4. 如何说“对于名称为green的颜色中的每个图片,在NSString中获取name值”?

我尝试了几种方法,但还没有得出结论。我是否只是误解了JSON的概念?


2
说实话,你可能在搜索方面出了些问题。与其搜寻“一站式”解决方案,不如按照以下方式搜索:
  1. 如何将文件添加到我的Xcode项目中?
  2. 如何使用Objective C编程读取文件?
  3. 如何在Objective C中解档JSON文件?
- dirtydanee
2
1: https://dev59.com/KIbca4cB1Zd3GeqPU11d 2: https://dev59.com/LV4d5IYBdhLWcg3wE_KP 3&4: 这都是关于解析JSON的问题,有很多相关的问题可以查看NSJSONSerialization - Larme
1
@Larme 这个问题并不那么糟糕,这实际上是 Stack Overflow 上唯一的谷歌搜索结果(也是第一个搜索结果),当我搜索“parse JSON file objective-c”时出现。如果我通过搜索 [ios] [objective-c] [json] parse 在 SO 上挖掘,结果似乎比这个不太清晰,并且答案更差。如果您有一个规范链接,请粘贴它,否则似乎 Google 认为 这是规范的。就我个人而言,我已经知道 1 和 2,如果我们将其从这个问题中删除,这个问题对于 (3) 来说非常好。 - jrh
@Larme 当然可以,但你说“有很多关于它的问题”——你能给一个链接吗?如果有更好的问题,我会标记为重复,我同意一次性问4个问题不是很好,但在这种特定情况下,我也认为这不是一个很大的问题,其他两个问题每个只需要1句话就可以回答,最后一个问题在我看来是(3)的一个相当温和的扩展。据我所知,这是目前Stack Overflow上最好的objc JSON解析问题。 - jrh
1
@Larme 当我写下这个问题时,我刚开始进行实际的应用程序开发,并被投入到了iOS系统和遗憾的Objective C中。我意识到这个问题可能被视为“过于宽泛”,但对我来说,它所提出的问题在逻辑上是相互关联的,因为它们都是我完全不清楚的一个过程的步骤。当时,要么没有关于这些步骤的单独问题,要么我不知道如何寻找它们。如果这个问题不再关闭,我会非常感激,因为它的答案很好,而且也很受欢迎。 - TomQDRS
显示剩余3条评论
1个回答

61

只需将您的JSON文件拖到Xcode项目导航窗格中,使其出现在与类文件相同的位置。

确保选中“需要时复制项目”复选框,并将其添加到正确的目标中。

然后执行以下操作:

- (void)doSomethingWithTheJson
{
    NSDictionary *dict = [self JSONFromFile];
    
    NSArray *colours = [dict objectForKey:@"colors"];
    
    for (NSDictionary *colour in colours) {
        NSString *name = [colour objectForKey:@"name"];
        NSLog(@"Colour name: %@", name);
        
        if ([name isEqualToString:@"green"]) {
            NSArray *pictures = [colour objectForKey:@"pictures"];
            for (NSDictionary *picture in pictures) {
                NSString *pictureName = [picture objectForKey:@"name"];
                NSLog(@"Picture name: %@", pictureName);
            }
        }
    }
}

// The return value is either NSArray * or NSDictionary *
- (id)JSONFromFile
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"colors" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    return [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
}

1
谢谢!这正是我所需要的,你真是我的救星! :) - TomQDRS
1
不要使用 - (NSDictionary *)JSONFromFile,最好使用 - (id)JSONFromFile。这样可以获取数组和字典。 - Carlos Guzman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接