【问题标题】:Parsing a JSON array into a NSDictionary将 JSON 数组解析为 NSDictionary
【发布时间】:2012-05-09 05:52:33
【问题描述】:

我正在使用 Wea​​ther Underground API 来制作应用程序,但在解析与严重警报相关的块时遇到了障碍。 JSON 使用具有子键值对的键值对——这对我来说不是问题,因为我可以从中制作后续的 NSDictionaries——但严重警报的条目已被证明是有问题的。见下文:

"alerts": [
    {
    "type": "WAT",
    "description": "Flash Flood Watch",
    "date": "3:13 PM EDT on April 28, 2012",
    "date_epoch": "1335640380",
    "expires": "8:00 AM EDT on April 29, 2012",
    "expires_epoch": "1335700800",
    "message": "\u000A...Flash Flood Watch in effect through Sunday morning...\u000A\u000AThe National Weather Service in Charleston has issued a\u000A\u000A* Flash Flood Watch for portions of northeast Kentucky... (Note: I trimmed this for length's sake),
    "phenomena": "FF",
    "significance": "A"
    }
]

“警报”对与我能够解析的其他“警报”对不同,因为它有一个围绕子值的 [ ] 括号,我不知道如何清除它,所以我可以访问子值。在我能够解析的其他示例中,它只有 { } 括号,而不是 { } 和 [ ] 括号。作为参考,括号始终存在——即使没有恶劣天气警报……在这种情况下,“警报”对返回括号 [ ],不存在子对。

有没有办法可以从 NSDictionary 中删除 [ ] 括号,或者忽略它们?任何建议将不胜感激!


对于参考和故障排除帮助,以下是我成功解析 JSON 文档其余部分的方法:

1) 从原始 JSON 创建一个 NSDictionary

//Process Weather Call
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

2) 为嵌套的 json 对创建后续字典

NSDictionary *current_observation = [json objectForKey:@"current_observation"];

3) 赋值

NSString* weather;
weather = [current_observation objectForKey:@"weather"];

所以最终结果将是一个字符串,上面写着“部分多云”或其他内容,以及许多我没有显示的相关天气值。这些解析成功,因为它们只有范围括号 {},而不是 [] 括号。

【问题讨论】:

    标签: objective-c json ios5 nsdictionary


    【解决方案1】:

    括号表示数组中的Json数据。你可以如下解析它

    NSArray *alertArray = [json objectForKey:@"alerts"];
    

    现在您应该遍历所有警报并解析它们(在您的情况下它只有 1,但在另一个 json 字符串中可能更多):

    //parse each alert
    for (NSDictionary *alert in alertArray ){
         NSString* description = [alert  objectForKey:@"description"];
        //etc...
    }
    

    【讨论】:

    • 当然是数组!那些括号应该已经放弃了......我想我今天工作太久了。 :p 无论如何,这在警报的上下文中也是有意义的——在给定的时间可以有多个警报,所以应该有一些方法可以在 API 中处理它。我会试一试——感谢您的帮助!
    【解决方案2】:

    好的,我让它工作了——我想在这里提供一个例子,因为我最终不得不基于@Lefteris 给出的建议来让它工作。

    我最终不得不首先将 json 数组作为 NSArray 传递,然后我将其转换为带有数组第一个元素的 NSDictionary。之后的一切都按照@Lefteris 的描述进行。

    所以,最后,这就是我所拥有的:

    NSArray *alerts = [json objectForKey:@"alerts"];
    NSDictionary *alertDict = [[NSDictionary alloc] init];
    
    //Check that no alerts exist to prevent crashing
    if([alerts count] < 1) {
        NSLog(@"No Alerts Here!");
        type = nil;
        ...
    }
    else  //Populate fields
    {
        alertDict = [alerts objectAtIndex:0];
        for (NSDictionary *alert in alertDict)
        {
            NSLog(@"Printing alert!");
            type = [alertDict objectForKey:@"type"];
            ...
        }
    } 
    

    这让我开始运行单个数组迭代——继续我希望我可以简单地遍历数组,因为我知道计数并处理任何额外的警报。再次感谢您的帮助!

    【讨论】:

    • 这段代码现在还在工作,我用你的例子自己试过了
    • @Khay 对不起?当时对我来说工作得很好。在我看来,没有人指出 10k 浏览量和 2 年过去的问题。您是否使用相同版本的 iOS 和相同(或可比较)的数据?另外,请查看 Lefteris 答案的编辑历史——代码去年在那里发生了变化,因此新版本很可能已经发生了一些变化。我真的不能告诉你,因为我不再使用 iOS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多