0

说你这样做,

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

"title"如果在 json 中完全丢失没问题:你只需得到null. 如果你这样做:

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

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

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

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

在实践中,您必须这样做:

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

我的问题是:

是否有一些非常聪明的方法可以覆盖文字语法(即,覆盖底层消息,也许??)来解决这个问题?

所以本质上,让这个概念[@"blah"]基本上首先检查它确实是一本字典,然后再尝试操作。

很遗憾,因为实际上,您永远无法使用这种美妙的语法

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

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

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

4

3 回答 3

1

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

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

由于您希望代码更短,我想我会在 NSDictionary 上创建可以用作的类别:

[json objectForPath:@"Key.Value"]

这会将路径扩展到键。

有一些不错的要点,看起来它正在这样做:

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

于 2014-08-13T10:32:41.283 回答
1

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

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

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

于 2014-08-13T10:41:07.473 回答
0

我会说这是您的架构的问题。nullJSON 中的和 JSON 中的字典(称为“对象”)是不同类型的事物。在我看来,您的密钥有时有时是字典的值这一事实null似乎表明你们没有遵循严格的模式。

一个好的设计应该有键或者不存在,或者如果存在,它的值保证是一个字典。在这种情况下,Objective-C 代码NSString *teste = yourData[@"location"][@"city"];无需修改即可工作,因为如果键“位置”不存在,那么它的值将nil在 Objective-C 中,后续访问不会崩溃,并且还会返回nil.

于 2014-08-15T09:09:45.453 回答