繁体   English   中英

如何从服务器以相同的顺序从服务器获取JSON对象iPhone

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM