[英]how to get JSON object from server as it (in the same order) iPhone
有没有办法以相同的顺序从服务器获取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;
};
}
是否有任何方法或框架来获取对象(从服务器返回的顺序相同)?
JSON和NSDictionary中的字典都是无序的,这意味着与在日志中看到的顺序无关。 这在JSON规范和NSDictionary文档中定义。
如果实际上很重要,那么显示的顺序是什么,那么您链接的API没有使用正确的JSON,或者您在应用程序中做错了什么。 为了帮助解决这些情况,您可以使用周围的几种NSDictionary实现。
请问为什么要确保按正确顺序维护字典?
我了解在某些情况下(我的情况)我的应用正在调用古老的JSON-> XML Web服务,客户端拒绝调整服务,因此它可以接受无序JSON(有效的JSON),但是如果您正在编写应用,为什么您是否需要确保顺序正确?
我有一个NSMutableDictionary子类,该子类将setObject:forKey
添加的对象保持在您调用可以在此处找到的方法的顺序中。
它的工作方式是在字典中存储NSMutableOrderedSet
键,然后重写keyEnumerator
方法以基于有序集返回枚举数
- (NSEnumerator *)keyEnumerator
{
return [self.orderedSetOfKeys objectEnumerator];
}
您可以修改我创建的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
我没有测试上面的代码,但是除非您想创建或修改现有的JSON解析器,否则看来这是您唯一的选择。
如果您确实想修改现有的解析器,则可能就像用LNOrderedMutableDictionary
替换字典实例以使所有内容LNOrderedMutableDictionary
一样简单。
扩展上述示例代码的另一个想法是替换
NSMutableOrderedSet *order = [[NSMutableOrderedSet alloc] initWithArray:@[@"key1",@"key2",@"key3"]];
在JSONWebServiceDictionary
字典中返回的数组,因为从JSON解析时数组保持其顺序,所以也许您可以这样做?
NSMutableOrderedSet *order = [[NSMutableOrderedSet alloc] initWithArray:[JSONWebServiceDictionary objectForKey:@"keyOrderArray"]]];
看你有什么。 如果测试结果,则从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);
}
这是一个相当普遍的问题。 这也可能是有关iOS的最烦人的部分。 (java根本没有这个问题)。 如果您想找回对象,请查看restkit.org。这个答案特别有帮助: https ://stackoverflow.com/a/8284343/836450
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.