【问题标题】:Sort JSON object in iOS在 iOS 中对 JSON 对象进行排序
【发布时间】:2014-08-19 17:32:39
【问题描述】:
“Colors” : {
    “Red : {
            “R” : 255,
            “G” : 100,
            “B” : 190,
            “Light” : {
                “R” : 195,
                “G” : 420,
                “B” : 255,
            },
            “Dark” : {
                “R” : 36.3458,
                “G” : 125.047,
                “B” : 49.4638,
            }
        },
        “Green” : {
            “R” : 12,
            “G” : 232,
            “B” : 150,
            “Light” : {
                “R” : 195,
                “G” : 420,
                “B” : 255,
            },
            “Dark” : {
                “R” : 36.3458,
                “G” : 125.047,
                “B” : 49.4638,
            }
        },
        “Blue” : {
            “R” : 105,
            “G” : 200,
            “B” : 150,
            “Light” : {
                “R” : 195,
                “G” : 420,
                “B” : 255,
            },
            “Dark” : {
                “R” : 36.3458,
                “G” : 125.047,
                “B” : 49.4638,
            }
        },
}

我想在 iOS 中按“R”、“G”、“B”排序。排序不是“Light” RGB 和“Dark” RGB。

我们如何对 JSON 对象进行排序?请帮帮我。

我可以对“R”、“G”、“B”进行排序。但对象“红色”、“绿色”、“蓝色”的顺序不正确。

NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"R" ascending:YES];
NSArray * sortDescriptor = [NSArray arrayWithObject:brandDescriptor];

输出

红12 绿色105 蓝色 255

您可以看到我按“R”排序,值按排序顺序排列,但颜色值“红、绿、蓝”不按顺序排列。

提前致谢。

【问题讨论】:

  • 您不对 JSON 对象进行排序。但是如果将 JSON 数据加载到数组中,则可以对数组进行排序。
  • @rmaddy 没错。 @user3908542 您的 json 对象中没有任何数组。只有数组是ordered collections,你有的是字典,字典是unordered collections,所以你不能对它们进行排序。正如 rmaddy 所说,您必须将它们存储在一个数组中才能对它们进行排序。
  • @maddy 和@HAS:你们都错了。 NSDictionary 只是 JSON 对象的表示。而这种容器恰好是一个 unordered 关联容器,JSON 对象可以很好地表示为 std::map,它是一个 ordered 关联容器,因此可以根据其Compare 函数进行排序。 JSON 本身只是“排序”没有意义的文本。但是我们可以对它的表示进行排序,即使是一个 JSON 对象,如果这是一个排序的关联容器。
  • 我解决了这个问题。现在我遇到了另一个与此相关的问题。我遇到错误“此类与键 的键值编码不兼容”我在对象名称中有空格,在对象名称中没有空格的情况下它工作得很好,但是如果对象名称有空格,那么它给了我错误。示例:对象名称“BrandName”然后工作,对象名称“品牌名称”,开始给我错误“这个类不符合键品牌名称的键值编码。”
  • 首先,访问 json.org 并学习 JSON 语法,至少要足够好,以免在复制/粘贴示例时省略关键字符。

标签: ios json


【解决方案1】:

其他人在 cmets 中所说的是正确的,但从我在您的问题中看到的情况来看,您实际上不需要进行排序。如果我理解正确,您只是想在 JSON 中的“Red”、“Green”和“Blue”字典中获取“R”的值。一种方法如下:

// grab json object here, which in your case returns a dictionary 
NSDictionary *json = [NSJSONSerialization
                          JSONObjectWithData:data // where data is simply your json above, for example
                          options:kNilOptions
                          error:&error];
NSDictionary *colors = [json valueForKey:@"Colors"]; // gives you a handle on the whole json blob of Colors
NSLog(@"R: %@", [[colors valueForKey:@"Red"] valueForKey:@"R"]); // this gets the R value for Red
NSLog(@"G: %@", [[colors valueForKey:@"Green"] valueForKey:@"R"]); // this gets the R value for Green
NSLog(@"B: %@" [[colors valueForKey:@"Blue" valueForKey:@"R"]); // this gets the R value for Blue

这有帮助吗?

(此外,您可能需要为 R 值使用更好的格式说明符,具体取决于它们的返回方式。如果整数使用 %d,如果浮点/双精度使用 %f)

【讨论】:

  • 我解决了这个问题。我不能放置我的实际 JSON 对象。现在我遇到了另一个与此相关的问题。我收到以下错误“此类与键 的键值编码不兼容”我在对象名称中有空格,在对象名称中没有空格但如果对象名称有空格,那么它工作得很好它给了我错误。示例:对象名称“BrandName”然后工作,对象名称“Brand Name”,开始给我错误“这个类不符合键品牌名称的键值编码。”有什么帮助吗?
猜你喜欢
  • 2017-06-07
  • 2018-02-13
  • 2011-05-12
  • 2013-07-15
  • 2020-03-06
  • 2014-09-27
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多