0

我使用openweathermap API打印当前天气。我需要解析这个JSON(带有可用城市的 JSON)。我试图用 NSJSONSerializer 解析它,但答案是:“错误 NSError * 域:@“NSCocoaErrorDomain” - 代码: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?

4

2 回答 2

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}},
  …
]

……或者像这样……</p>

{
  {"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);
  }
}
于 2015-07-22T11:19:18.110 回答
0

您的 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}},    
...]

请注意末尾的封装方括号和逗号。

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

于 2015-07-22T11:16:51.693 回答