尝试获取下面的json,所有标签都是动态不固定的。
{
Level1: {
row1: {
1: "on",
2: "off",
3: "off",
4: "on",
5: "on",
6: "on",
7: "on",
8: "on",
9: "on",
10: "on",
11: "on",
12: "on",
13: "on",
14: "on",
15: "on",
16: "on",
17: "on",
18: "on",
19: "on",
20: "on",
attr: {
total: "20",
type: "Gold"
}
},
row10: {
1: "on",
2: "on",
3: "on",
4: "on",
5: "on",
6: "on",
7: "on",
8: "on",
9: "on",
10: "on",
11: "on",
12: "on",
13: "on",
14: "on",
15: "on",
16: "on",
17: "on",
18: "on",
19: "on",
20: "on",
attr: {
total: "20",
type: "Bronze"
}
}
},
Level3: {
row1: {
1: "on",
2: "on",
3: "on",
4: "on",
5: "on",
6: "on",
7: "on",
8: "on",
9: "on",
10: "on",
11: "on",
12: "on",
13: "on",
14: "on",
15: "on",
16: "on",
17: "on",
18: "on",
19: "on",
20: "on",
attr: {
total: "20",
type: "Gold"
}
},
row5: {
1: "on",
2: "on",
3: "on",
4: "on",
5: "on",
6: "on",
7: "on",
8: "on",
9: "on",
10: "on",
11: "on",
12: "on",
13: "on",
14: "on",
15: "on",
16: "on",
17: "on",
18: "on",
19: "on",
20: "on",
attr: {
total: "20",
type: "Bronze"
}
}
}
}
这是我到目前为止所尝试的。
NSString *level;
for(NSString *key in [[self.mGetDataDict allKeys]sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)])
{
NSLog(@"Accessing .... %@",key);
level = key;
for(NSString *rowKey in self.mGetDataDict[key])
{
[arrayLevels addObject:level];
NSLog(@"%@",rowKey);
[arrRows addObject:rowKey];
for(NSString *valueKey in self.mGetDataDict[key][rowKey])
{
// NSLog(@"%@ -> %@",valueKey,self.mGetDataDict[key][rowKey][valueKey]);
if([valueKey isEqualToString:@"attr"])
{
dictRow = self.mGetDataDict[key][rowKey][valueKey];
}
else{
//dictRow = self.mGetDataDict[key][rowKey][valueKey];
[arrSeatsStatus addObject:self.mGetDataDict[key][rowKey][valueKey]];
}
}
NSLog(@"--------ROW OVER------------%@\n", dictRow);
[arrSeats addObject:[dictRow valueForKey:@"total"]];
NSString *strTypes = [NSString stringWithFormat:@"%@ %@", [arrayLevels objectAtIndex:i], [dictRow valueForKey:@"type"]];
[arrTypes addObject:strTypes];
NSMutableArray *array = [NSMutableArray array];
array = [arrSeatsStatus copy];
[seatsDict setObject:array forKey:[NSString stringWithFormat:@"%d",i]];
i++;
[arrSeatsStatus removeAllObjects];
NSLog(@"--------seats dict------------%@\n", seatsDict);
NSLog(@"--------seats in row------------%@\n", arrSeats);
// NSLog(@"--------seats status------------%@\n", arrStatus);
NSString *row = [NSString stringWithFormat:@"%@",[arrSeats objectAtIndex:0]];
rows = [row integerValue];
}
NSString *num = [arrSeats valueForKeyPath: @"@sum.self"];
tot = [num integerValue];
[arrTot addObject:[NSString stringWithFormat:@"%d",tot]];
tot = 0;
//[arrSeats removeAllObjects];
NSLog(@"--------ROW OVER tot seats------------%@\n", arrTot);
NSLog(@"--------------------seats:%@\n", num);
NSLog(@"--------------------\n");
}
问题在于,当获取数据时,它不是来自JSON的顺序。例如,当上面的代码运行时,它首先获取level2然后row2然后按某种顺序进一步但不按顺序如上所示。希望我说清楚。请指导以上。提前谢谢。
答案 0 :(得分:1)
例如,替换
for(NSString *rowKey in self.mGetDataDict[key])
与
NSDictionary *rowDict = self.mGetDataDict[key];
for (NSString *rowKey in rowDict)
(虽然试着想出“rowDict”更具描述性的名称)
是的,它是更多的字符,但在后面的行中,您可以引用rowDict[something]
,也可能稍后引用valueDict[something]
而不是长索引链。两者都更有效,更容易保持直线。
答案 1 :(得分:0)
我完全赞同 Hot Licks ,关注你的代码和你的问题的想法真的很复杂:)据我所知,你问,为什么你没有排序你的密钥他们在json的方式。
您用来获取它们的工具是将您的json转换为NSDictionary,而NSDictionary并不保证密钥以任何方式排序或在放入时保留。因此,您正在使用比较器 - @selector(caseInsensitiveCompare :) 以某种方式对键进行排序。
所以答案是: 如果你想以复杂的方式对键进行排序(为了“保留在json中的顺序”不能单独完成,你必须在从NSDictionary检索键时这样做),你必须实现你自己的比较器。这不是 caseInsensitiveCompare:,而是必须使用自定义选择器。您可以找到in great amount around stackoverflow
的示例希望这有帮助。