密钥未知时获取对象?

Posted

技术标签:

【中文标题】密钥未知时获取对象?【英文标题】:Getting object when key is unknown? 【发布时间】:2011-10-04 13:53:11 【问题描述】:

我有一些如下所示的 json,我正试图将其转换为 nsdictionaries。我的问题是 1、5 和 4 是键,具有不可预测的值。我如何在不知道密钥的情况下获取每个对象 - "id":"A","name":"Nike"?

// JSON looks like:

"shops":

"1":"id":"A","name":"Nike",
"5":"id":"G","name":"Apple"
"4":"id":"I","name":"Target"



// how to step thru this?
NSArray *shopsArray = [[shopsString JSONValue] objectForKey:@"shops"];

【问题讨论】:

【参考方案1】:

objectForKey:@"shops" 返回的对象实际上是NSDictionary 实例,而不是NSArray,因为键实际上是字符串,而不是数值。

出于您的目的,您可以在生成的NSDictionary 上简单地调用-allValues

NSDictionary *shops = [[shopsString JSONValue] objectForKey:@"shops"];

for(id obj in [shops allValues]) 
  //do stuff with obj...

编辑:如果您需要对值进行排序,则可以执行以下操作:

首先,将传入的 JSON 改成这种结构:


  "shops":[
      "key":"1", "id":"A","name":"Nike",
      "key":"5","id":"G","name":"Apple",
      "key":"4", "id":"I","name":"Target"
  ]

然后,您可以对数组中的对象进行排序。

NSArray *shops = [[shopsString JSONValue] objectForKey:@"shops"];
for(NSDictionary *shop in shops) 
  NSString *key = [shop objectForKey:@"key"];
  //...

【讨论】:

刚刚检查了 json.org。将裸数字用作 JSON 对象中值的 key 是非法的。此外,如果我使用 JSON 解析器将 JSON 对象(而不是 JSON 数组)解码为 NSArray 只是因为键都恰好是数字,我会扔掉它并得到一个有效的。 @JeremyP Snap,我在用纯 javascript 思考。将修改。 使用 NSDictionary 和 allValues 返回一个不是 1,5,4 顺序的集合。有没有办法按顺序通过?

以上是关于密钥未知时获取对象?的主要内容,如果未能解决你的问题,请参考以下文章

从表中获取密钥在编译时未知

如何从 json 对象中获取密钥

Vue.js 为 v-for 获取未知的 Json 密钥

创建 azure vm 时,terraform 抛出“无效或未知的密钥:区域”

仅当特定密钥对值与可迭代匹配时,才在 JSON 对象中获取多个 JSON 密钥对值

尝试将服务推送到 Apollo Engine 时,如何修复“将服务上传到引擎 → 未知指令“密钥””错误?