有没有办法以相同的顺序从服务器获取JSON对象?
例如,当我使用浏览器时,我的JSON对象返回如下:
{
"23": {
"numberOfRecords": "3",
"startDate": "27/11/2013",
"endDate": "31/12/2014",
"question": "How do you rate the new MenaME Portal ?",
"voteScale": "5",
"questions": {
"option1": {
"value": "1",
"option": "Poor",
"voteResult": "50.000"
},
"option2": {
"value": "2",
"option": "Acceptable",
"voteResult": "0.000"
},
"option3": {
"value": "3",
"option": "Good",
"voteResult": "0.000"
},
"option4": {
"value": "4",
"option": "Very Good",
"voteResult": "0.000"
},
"option5": {
"value": "5",
"option": "Excellent",
"voteResult": "50.000"
}
},
"selectedAnswer": "0",
"voteAnswered": "0",
"votes": "6"
}
}
用[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]
对象返回如下:
{
23 = {
endDate = "31/12/2014";
numberOfRecords = 3;
question = "How do you rate the new MenaME Portal ?";
questions = {
option1 = {
option = Poor;
value = 1;
voteResult = "50.000";
};
option2 = {
option = Acceptable;
value = 2;
voteResult = "0.000";
};
option3 = {
option = Good;
value = 3;
voteResult = "0.000";
};
option4 = {
option = "Very Good";
value = 4;
voteResult = "0.000";
};
option5 = {
option = Excellent;
value = 5;
voteResult = "50.000";
};
};
selectedAnswer = 0;
startDate = "27/11/2013";
voteAnswered = 0;
voteScale = 5;
votes = 6;
};
}
是否有任何方法或框架来获取对象(以与服务器返回的相同顺序)?
答案 0 :(得分:1)
JSON和NSDictionary中的字典都是无序的,这意味着您在日志中看到的内容与您的顺序无关。这在JSON规范和NSDictionary的文档中定义。
如果实际对显示的内容有什么影响,那么您链接到的API没有使用正确的JSON,或者您在应用中做错了什么。为了帮助解决这些问题,您可以使用几个已排序的NSDictionary实现。
答案 1 :(得分:1)
我可以问你为什么要确保字典按照正确的顺序维护?
我理解在某些情况下(我的)古老的JSON - >我的应用程序正在调用XML Web服务,客户端拒绝调整服务,因此它可以接受无序的JSON(有效的json),但如果您正在编写应用程序,为什么还需要确保它是有序的?
我有一个NSMutableDictionary子类,它按照您调用方法的顺序setObject:forKey
保持NSMutableOrderedSet
添加的对象。
它的工作原理是在字典中存储- (NSEnumerator *)keyEnumerator
{
return [self.orderedSetOfKeys objectEnumerator];
}
个键,然后覆盖found here方法以返回基于有序集的枚举器
NSMutableDictionary
您可以修改我创建的NSMutableOrderedSet
子类以在公共标题中公开NSDictionary *JSONWebServiceDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
LNOrderedMutableDictionary *orderedDictionary = [[LNOrderedMutableDictionary alloc] initWithDictionary:JSONWebServiceDictionary];
NSMutableOrderedSet *order = [[NSMutableOrderedSet alloc] initWithArray:@[@"key1",@"key2",@"key3"]]; //All the keys you are expecting and the order you want them in..
orderedDictionary.orderSet = order; //orderSet does not exist.. it is currently called `array` and not exposed in LNOrderedMutableDictionary.h
,然后自己修改此集以获取字典的有序版本。例如:
LNOrderedMutableDictionary
我没有测试上面的代码,但除非你想创建或修改现有的JSON解析器,否则它似乎是你唯一的选择..
如果你确实想要修改现有的解析器,那么它可能就像用NSMutableOrderedSet *order = [[NSMutableOrderedSet alloc] initWithArray:@[@"key1",@"key2",@"key3"]];
替换字典实例一样简单,以保持一切顺序。
扩展上述示例代码的另一个想法可能是替换
JSONWebServiceDictionary
在NSMutableOrderedSet *order = [[NSMutableOrderedSet alloc] initWithArray:[JSONWebServiceDictionary objectForKey:@"keyOrderArray"]]];
字典中返回一个数组,因为数组在从JSON解析时保持其顺序,所以也许你可以这样做?
{{1}}
答案 2 :(得分:0)
看看你有什么。如果你测试结果你从JSONObjectWithData(我们假设它被声明为id jsonObject
)回来了
if ([jsonObject isKindOfClass:[NSDictionary class]) { ...
或
NSLog(@"The object type is %@", [jsonObject class]);
你会发现它确实是一个NSDictionary(或者也许是一个NSMutableDictionary)。从转储中可以看到该字典(或从几乎相同的JSON推断)包含一个键为“23”的条目。
因此,让我们将jsonObject转换为NSDictionary并引用它:
NSDictionary* jsonDict = (NSDictionary*) jsonObject;
NSDictionary* entry23Dict = [jsonDict objectForKey:@"23"];
现在,如果您使用NSLog entry23Dict,您会发现它包含上述所有内容,而没有{ 23 = ... }
最外层字典。
然后,您可以使用
访问“问题”NSDictionary* questDict = [entry23Dict objectForKey:@"questions"];
从那里可以以类似的方式访问个人“option1”,“option2”,......“option5”词典。您只需一次进行一层 - 不要被整个结构所淹没。 (当你第一次学习时,通常有用的是NSLog每个“层”,当你从包含的结构中“剥离”它。)
当然,您拥有NSDictionary对象可用的所有标准工具(以及NSArray对象,如果您的JSON包含任何[..]
数组)。例如,您可以使用
for (NSString* key in jsonDict) {
NSLog(@"This entry's number is %@", key); // For the above will print "23"
NSDictionary* numberedDict = jsonDict[key]; // Using the "new" form of dictionary access
NSString* endDate = numberedDict[@"endDate"]; // Ditto
NSLog(@"The end date is %@", endDate);
}
答案 3 :(得分:-1)
这是一个相当普遍的问题。它也可能是关于iOS最烦人的部分。 (java根本没有这个问题)。如果你想找回对象,请查看restkit.org具体来说,这个答案可能有所帮助:https://stackoverflow.com/a/8284343/836450