说你这样做,
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。
答案 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
。