返回具有多个键的 NSDictionary 中对象的值

Posted

技术标签:

【中文标题】返回具有多个键的 NSDictionary 中对象的值【英文标题】:Return value of object in NSDictionary with several keys 【发布时间】:2015-03-07 16:25:54 【问题描述】:

我从 NSURLRequest 中得到一个字符串。然后我反序列化字符串以将其转换为 NSDictionary,如下所示:

NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                   if(responseString && responseString.length) 
                                       NSLog(@"%@", responseString);
                                       NSError *jsonError;
                                       NSData *objectData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
                                       NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData
                                                                                            options:NSJSONReadingMutableContainers
                                                                                              error:&jsonError];
                                       NSLog(@"STRING DESERIALIZADA=%@",json);

我得到以下 json NSDictionary 的结果:


    meta =     
        limit = 20;
        next = "<null>";
        offset = 0;
        previous = "<null>";
        "total_count" = 1;
    ;
    objects =     (
                
            color = Plata;
            "current_latitude" = "-12.19061989";
            "current_longitude" = "-77.004078";
            employee =             
                active = 1;
                dni = 78965412;
                id = 2;
                lastname = volongo;
                mail = "rv@alosda.pe";
                name = Ronaldo;
                phone = 12355688;
                photo = "http://example_url/media/employee/default.png";
                "resource_uri" = "/rest/employee/2/";
            ;
            id = 1;
            "license_plate" = 2752727;
            model = Toyota;
            "property_card" = "AAA-XXX";
            "resource_uri" = "/rest/clientaxiradio/1/";
            state = 0;
            year = 2014;
        
    );

这一次,“objects”键下的结果包括1个对象,但以后结果响应中的对象会更多。

我需要知道的是在这种情况下(只有 1 个对象)以及响应包含多个对象时如何检索每个对象键的值。

谢谢。

【问题讨论】:

我对你的最后一句话有点困惑。您是在问如何从object 中检索所有objects,或者如何从字典中检索多个object(及其子项)? @l'L'l,对不起我的英语,我的意思是,例如,如何从现在在 NSDictionary 中的唯一对象中检索 current_location 的值,以及稍后,当字典可能有多个对象,如何从所有对象中检索 current_latitude 的值。 你可以将对象保存在 NSArray.. 并且 NSArray 数组将是字典数组 假设你的完整数据在 NSDictionary json for Object 你可以写 NSArray * objects=[json objectForKey:@"objects"];该数组将包含对象中的所有字典此外,您现在可以使用对象数组解析 json @Rajan,谢谢,我会试试的。 【参考方案1】:

最快 方法可能使用NSEnumerator 来获取您想要的值。在下面的示例中,您将看到如何通过所有键以及单个键来enumerate

// NSEnumerator
id key = nil;
NSEnumerator *enumerator = [[json allKeys] objectEnumerator];
while ((key = [enumerator nextObject]))

    id object = json[key];
    NSLog(@"%@",object); // output all objects values in NSDictionary json


// Fast Enumeration
for (id key in [json allKeys])

    id object = json[key];
    NSLog(@"%@",object); // output all objects values in NSDictionary json 

如果您的 NSDictionary 中有多个 object 键,您可以这样做:

NSDictionary *obj = [json objectForKey:@"object"]
for (id key in obj)

    id object = json[key];
    NSLog(@"%@",object); 
   // output all objects values in NSDictionary json from "object" key

如果objectNSDictionary 中的NSArray

NSArray *obj = [json objectForKey:@"object"];
    for (id key in obj)
    
        id object = key;
        NSLog(@"%@",object);
    

如果你想要一个单独的键object

NSLog(@"%@",[json objectForKey:@"current_latitude"]); // would output -12.19061989

有关更多信息,请参阅 Apple 开发者网站上的 Fast Enumeration

【讨论】:

我已经实现了您的所有建议,但在所有情况下,键 @"current_latitude" 的对象的输出都是 (null)。所有对象的 NSLog 都正常。 由于objects 键是一个数组或字典,您需要将其用于current_latitude。所以你会做一些诸如[objects objectForKey:@"current_latitude"];之类的事情我也建议不要使用objectsobject作为字典键——它只会让你感到困惑,并且使用常量名称作为变量不是一个好习惯。跨度> 我知道current_latitude 有什么问题;它被引号包围 - 所以要么摆脱它们,要么将其更改为 [json objectForKey:@"\"current_latitude\""];

以上是关于返回具有多个键的 NSDictionary 中对象的值的主要内容,如果未能解决你的问题,请参考以下文章

具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?

NSDictionary 中的嵌套对象与 RestKit

如何使用包含Swift中相同键的多个值的查询参数构建URL?

值/对象的 NSDictionary 键? [复制]

NSDictionary 在插入数据时不返回键的排列方式?

如何在 C# 中缓存具有多个键的对象