objective-c JSON文字,嵌套 - 最优雅的解决方案?

时间:2014-08-13 09:58:03

标签: ios json objective-c-literals

说你这样做,

NSString *teste = yourData[@"title"];

如果json中完全缺少"title",则没问题:您只需null。如果你这样做:

NSString *teste = yourData[@"location"][@"city"];

如果json嵌套中缺少"city",没问题。如果整个"location"部分不存在,则再次没有问题

然而!你会经常看到这样的json," largeImage = "<null>"; "

在这种情况下,如果您使用上述代码,应用程序将崩溃。

在实践中你必须这样做:

NSString *imageUrl = nil;
if ([yourResults[thisRow][@"largeImage"] isKindOfClass:[NSDictionary class]])
    imageUrl = yourResults[thisRow][@"largeImage"][@"URL"];

我的问题是:

是否有一些死聪明的方法可能会覆盖文字语法(即覆盖基础信息,也许??)来解决这个问题?

基本上,在尝试操作之前,首先要使这个概念[@"blah"]首先检查它是否是一本字典。

这是一种耻辱,因为,实际上,你永远不能使用这种精彩的语法

yourData[@"location"][@"city"]

在实践中,由于我概述的问题。

对于早先对这个问题的困惑感到抱歉,由Paramag修复。下面 - 好的一个Paramag。

3 个答案:

答案 0 :(得分:1)

我个人使用的是JSON类,它返回null而不是NSNull所以我的代码看起来是:

[[json objectForKeyNotNull:@"Key"] objectForKeyNotNull:@"Other"]

由于你想让代码更短,我想我会在NSDictionary上创建一个类别,可以用作:

[json objectForPath:@"Key.Value"]

这会将路径扩展到密钥中。

有一些不错的要点看起来像是在做:

https://gist.github.com/Yulong/229a62c1188c3c024247#file-nsdictionary-beeextension-m-L68

答案 1 :(得分:1)

要检查这种null,可以使用valueForKeyPath:

NSString * teste = [CLOUD.yourData [thisRow] valueForKeyPath:@“location.city”];

首先检查“位置”,然后检查“城市”。

答案 2 :(得分:0)

我想说这是你架构的问题。 JSON中的null和JSON中的字典(称为“对象”)是不同类型的东西。事实上,您的密钥的值有时为null,有时候字典在我看来,你们并没有遵循严格的架构。

好的设计会让密钥不在那里,或者如果它在那里,它的值保证是字典。在这种情况下,Objective-C代码NSString *teste = yourData[@"location"][@"city"];可以不加修改地工作,因为如果密钥“location”不存在,那么它在Objective-C中的值将是nil,并且随后的访问将获胜不会崩溃,也会返回nil