【问题标题】:Error with parsing JSON with NSJSONSerialization使用 NSJSONSerialization 解析 JSON 时出错
【发布时间】:2015-07-22 11:06:02
【问题描述】:

我使用openweathermap API 打印当前天气。我需要解析this JSON(带有可用城市的 JSON)。我试图用 NSJSONSerializer 解析它,但答案是:"error NSError * domain: @"NSCocoaErrorDomain" - code: 3840"。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"city.list" ofType:@"json"];
NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSError *error;
NSData *objectData = [myJSON dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error];

据我了解,错误 3840 表示 JSON 格式错误,但我已从官方 openweathermap 页面下载 JSON。怎么了?如何正确解析这个 JSON?

【问题讨论】:

    标签: objective-c json xcode parsing openweathermap


    【解决方案1】:

    该文件不是有效的 JSON,而是有效 JSON 的列表。

    {"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}}
    {"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}}
    {"_id":1283378,"name":"Gorkhā","country":"NP","coord":{"lon":84.633331,"lat":28}}
    …
    

    有效 JSON 中的此类列表如下所示……:

    [
      {"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}},
      {"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}},
      {"_id":1283378,"name":"Gorkhā","country":"NP","coord":{"lon":84.633331,"lat":28}},
      …
    ]
    

    ……或者像这样……

    {
      {"707860": {"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}},
      {"519188": {"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}},
      {"1283378":{"name":"Gorkhā","country":"NP","coord":{"lon":84.633331,"lat":28}},
      …
    

    但是,您可以做的是遍历列表并将其单独转换为项目:

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"city.list" ofType:@"json"];
    NSString *myList = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    
    // Separate the lines
    NSArray *myItems = [myList componentsSeperatedByCharactersInSet:[NSCharacterSet newLineCharacterSet];
    
    NSError *error;
    for( NSString *JSON in myItems ) 
    {
      if( [JSON length]==0) 
      {
        // empty line
        continue;
      }
      NSData *objectData = [JSON dataUsingEncoding:NSUTF8StringEncoding];
      NSDictionary *object = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error];
      if( object == nil )
      {
        NSLog( @"Error %@ reading\n%@", error, JSON);
      }
    }
    

    【讨论】:

    • 谢谢!有用!但是... JSON 文件中的第一个和最后一个字符串不解析。在 NSJSONSerialization 之后,我得到“nil”......我简直无法理解为什么! :(
    • 所以看看错误。这就是它的用途。
    • 错误相同:“错误 NSError * 域:@“NSCocoaErrorDomain”-代码:3840”。错误的 JSON 格式...但字符串相似
    • 啊,最后一行可能会产生错误,因为它是空的。我认为第一行有这样的问题。我更改了代码来处理它。但是,打印出损坏的行和错误。我也加了。
    【解决方案2】:

    您的 json 格式不正确。

    {"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}}
    {"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}}
    

    应该是

    [{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}},
    {"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}},    
    ...]
    

    注意最后的封装方括号和逗号。

    或者您可以逐行解析文本(似乎应该这样解析)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多