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

时间:2014-01-04 01:46:21

标签: ios iphone json ios7

有没有办法以相同的顺序从服务器获取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;
};
}

是否有任何方法或框架来获取对象(以与服务器返回的相同顺序)?

4 个答案:

答案 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