【问题标题】: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"];

【问题讨论】:

    标签: iphone objective-c ios json nsdictionary


    【解决方案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 顺序的集合。有没有办法按顺序通过?
    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2020-09-25
    • 2016-08-11
    相关资源
    最近更新 更多