【问题标题】:Objective C - Issue when read JSON Key目标 C - 读取 JSON 密钥时的问题
【发布时间】:2020-02-02 20:43:18
【问题描述】:

大家好,我正在 xCode 项目中使用 JSON file

我可以轻松显示各种 JSON 键,但是当我调用某个键时,它会指定我的应用程序崩溃,我不明白为什么......

我非常小心地正确编写了密钥,但它一直在崩溃......

这是我的例子JSON file

{
  "Università" : {
    "uniID" : {
      "latitudine" : 43.115441,
      "longitudine" : 12.389587,
      "nome" : "Università per stranieri di Perugia",
      "regione" : "Umbria"
    },
    "uniID" : {
      "latitudine" : 41.860348,
      "longitudine" : 12.496308,
      "nome" : "Università degli Studi Internazionali di Roma ( UNINT )",
      "regione" : "Lazio"
    },
}
}

当我尝试恢复 "name" 键时,我的应用崩溃了,即使我调用 "latitude""longitude"强>等...

我哪里做错了?

这些是我用来读取 JSON 文件的函数

-(void)setupUniversityLocation:(MKMapView *)mapView {

    NSDictionary *dict = [self JSONUniversity];
    NSArray *universityArray = [[dict objectForKey:@"Università"] objectForKey:@"uniID"];

       for (NSDictionary *uni in universityArray) {

           NSString *uniname = [uni objectForKey:@"nome"];
           NSLog(@"uniname  %@",uniname);
 }
}

#pragma mark - Read JSON Data University

-(NSDictionary *)JSONUniversity {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"university" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    return [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
}

我还想问你如何直接读取键 "name""latitude" 等...而不在哪里调用 " uniID" 键?是否可以绕过类别键?

【问题讨论】:

  • 嗨!你能发布你的错误信息吗?

标签: ios arrays objective-c json dictionary


【解决方案1】:

您发布的示例 JSON 中没有数组。

所以在这一行:

NSArray *universityArray = [[dict objectForKey:@"Università"] objectForKey:@"uniID"];

当您假设输出是一个数组时,实际上它是一个字典。

如果您在该行之后放置一条日志语句输出返回的类的类型:

NSLog(@"Kind of class returned from univeristyArray = %@", [universityArray class]);

它会返回:

Kind of class returned from univeristyArray = __NSDictionaryI

现在您发布的 JSON 示例的结构是:

Top Level Object (Dictionary)
  "Università" (Dictionary)
    "uniID" (Dictionary)

这种结构的另一个问题是“Università”字典下的同一个键有多个值(即具有不同关联值的多个“uniID”)

如果您可以控制生成的 JSON,则根据您要执行的操作,您有几个不同的选项:

  1. 从您的代码看来,您正在尝试遍历所有“Università”并输出它们的名称——并且您希望它们存储在一个数组中。在这种情况下,您需要将“Università”数据结构更改为 JSON 中的数组。
  2. 或者,将大学的“nome”值设置为较低级别字典的键,然后按名称获取它们(仅当大学名称将是唯一的)- 如果您有一个大字典,这会很好大学列表,而您正试图仅获取特定大学(按名称)。

#1 示例:

university.json:

{
    "Università" : [
        {
            "latitudine" : 43.115441,
            "longitudine" : 12.389587,
            "nome" : "Università per stranieri di Perugia",
            "regione" : "Umbria"
        },
        {
            "latitudine" : 41.860348,
            "longitudine" : 12.496308,
            "nome" : "Università degli Studi Internazionali di Roma ( UNINT )",
            "regione" : "Lazio"
        },
    ]
}

设置大学位置:

-(void)setupUniversityLocation {
    NSDictionary *dict = [self JSONUniversity];
    NSArray *universityArray = [dict objectForKey:@"Università"];
    for (NSDictionary *uni in universityArray) {
        NSString *uniname = [uni objectForKey:@"nome"];
        NSLog(@"uniname  %@",uniname);
    }
}

#2 示例:

university.json:

{
    "Università" : {
        "Università per stranieri di Perugia": {
            "latitudine" : 43.115441,
            "longitudine" : 12.389587,
            "regione" : "Umbria"
        },
        "Università degli Studi Internazionali di Roma ( UNINT )": {
            "latitudine" : 41.860348,
            "longitudine" : 12.496308,
            "regione" : "Lazio"
        },
    }
}

设置大学位置:

-(void)setupUniversityLocation {
    NSDictionary *dict = [self JSONUniversity];
    NSDictionary *universityDictionary = [dict objectForKey:@"Università"];
    // this is an example of looping through the entire dictionary
    // typically you'd use objectForKey when accessing a specific university
    for (NSString *universityNameKey in universityDictionary.allKeys) {
        NSDictionary *specificUniDictionary = [universityDictionary objectForKey:universityNameKey];
        NSLog(@"uniname  %@",universityNameKey);
        NSLog(@"latitudine %@", [specificUniDictionary objectForKey:@"latitudine"]);
        NSLog(@"longitudine %@", [specificUniDictionary objectForKey:@"longitudine"]);

    }
}

在大多数情况下,我建议使用第二个选项,因为它是一个很大的列表,查找特定项目会更快,但这绝对取决于您的用例。

【讨论】:

    【解决方案2】:

    您的 json 文件中没有数组。您应该将 json 文件更改为

    {
        "Università" : [
            {
                "latitudine" : 43.115441,
                "longitudine" : 12.389587,
                "nome" : "Università per stranieri di Perugia",
                "regione" : "Umbria"
            },
            {
                "latitudine" : 41.860348,
                "longitudine" : 12.496308,
                "nome" : "Università degli Studi Internazionali di Roma ( UNINT )",
                "regione" : "Lazio"
            }
        ]
    }
    

    使用[] 代替{} 来显示数组,下面的代码将起作用

    -(void)setupUniversityLocation:(MKMapView *)mapView {
    
        NSDictionary *dict = [self JSONUniversity];
        NSArray *universityArray = [dict objectForKey:@"Università"];
    
        for (NSDictionary *uni in universityArray) {
            NSString *uniname = [uni objectForKey:@"nome"];
            NSLog(@"uniname  %@",uniname);
        }
    }
    
    #pragma mark - Read JSON Data University
    
    -(NSDictionary *)JSONUniversity {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"university" ofType:@"json"];
        NSData *data = [NSData dataWithContentsOfFile:path];
        return [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2021-12-14
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      相关资源
      最近更新 更多