【问题标题】:objective-c JSON literals, nested - most elegant solution?Objective-c JSON 文字,嵌套 - 最优雅的解决方案?
【发布时间】:2014-08-13 09:58:02
【问题描述】:

说你这样做,

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

如果 "title" 在 json 中完全丢失,没问题:你只需得到 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"]

实际上,由于我概述的问题。

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

【问题讨论】:

  • But if the whole "location" section does not exist, then ... your iPhone crashes. - 什么?不。然后你向nil 发送一条消息,这是一个安全的无操作。

标签: ios json objective-c-literals


【解决方案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

【讨论】:

  • 哇,两个好主意!在 objectForKeyNotNull 中,您还可以检查 isKindOfClass,就像在我的后记中一样。
  • 看看我添加到帖子中的链接。代码看起来很不错,而且还进行了 Null 检查。
  • 好一个,请记住,尽管真正的问题是“这不是字典”问题 - 我澄清了我的坏问题!欢呼
【解决方案2】:

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

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

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

【讨论】:

  • 一个值得回答的问题,但一个问题是“location.city”以一种你不会想到的奇怪方式失败,如果第一个不是字典而是字符串 - 这有点烦人。
【解决方案3】:

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

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

【讨论】:

  • 嗨 NewAcct,对,你已经很好地概述了这个问题 - “值保证是字典......”,你不能保证在现实生活中在任何项目上,这都是问题所在。 (一个日常示例是,如果您从亚马逊提取结果,看在上帝的份上!!!,它们通常会错误地返回字符串“”而不是真正的 null。)正如您所暗示的那样,当然,在一个应用程序中,你不能依赖 json 是正确的 - 否则你的应用程序会崩溃一整天:) (假设我理解你所说的正确,如果没有,对不起。)
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2010-10-04
  • 2023-03-19
  • 2021-12-31
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多