从 NSDictionary 中提取数据

Posted

技术标签:

【中文标题】从 NSDictionary 中提取数据【英文标题】:Pulling Data from an NSDictionary 【发布时间】:2015-10-24 18:30:55 【问题描述】:

所以我有一个包含各种数据的 NSDictionary。打印到日志时,打印如下:

["user_id":3016817,"grade":"A","percent":"93","grading_periods":["assignments":["points":100.0,"grade":"A","score":95.0,"percent":"93","comment":null,"id":3268180,"points":100.0,"grade":"A","score":90.0,"percent":"93","comment":null,"id":3268181],"grade":"A","percent":"93","name":"Default"],"user_id":3016818,"grade":"A","percent":"94","grading_periods":["assignments":["points":100.0,"grade":"A","score":92.0,"percent":"94","comment":null,"id":3268180,"points":100.0,"grade":"A","score":95.0,"percent":"94","comment":null,"id":3268181],"grade":"A","percent":"94","name":"Default"]]

如果我使用在线格式化程序,它的可读性会更高,看起来像这样:

[

    "user_id": 3016817, 
    "grade": "A", 
    "percent": "93", 
    "grading_periods": [
        
            "assignments": [
                
                    "points": 100, 
                    "grade": "A", 
                    "score": 95, 
                    "percent": "93", 
                    "comment": null, 
                    "id": 3268180
                , 
                
                    "points": 100, 
                    "grade": "A", 
                    "score": 90, 
                    "percent": "93", 
                    "comment": null, 
                    "id": 3268181
                
            ], 
            "grade": "A", 
            "percent": "93", 
            "name": "Default"
        
    ]
, 

    "user_id": 3016818, 
    "grade": "A", 
    "percent": "94", 
    "grading_periods": [
        
            "assignments": [
                
                    "points": 100, 
                    "grade": "A", 
                    "score": 92, 
                    "percent": "94", 
                    "comment": null, 
                    "id": 3268180
                , 
                
                    "points": 100, 
                    "grade": "A", 
                    "score": 95, 
                    "percent": "94", 
                    "comment": null, 
                    "id": 3268181
                
            ], 
            "grade": "A", 
            "percent": "94", 
            "name": "Default"
        
    ]

]

我的问题是如何使用这本字典访问特定 user_id 的等级或分数值?

【问题讨论】:

这不是字典。这是一个字典数组。差别很大! 如果这是 JSON,有什么理由不使用 NSJSONSerialization? 哦,好的!这将如何影响我访问数据的方式?我很好奇,因为所有这些都在一个 NSDictionary 变量中。 您在声明它时可能已将其称为为 NSDictionary 变量,但这并不能使其成为 NSDictionary。对编译器撒谎只会导致稍后当您尝试将其视为 NSDictionary 而它不是一个时崩溃。它是一个 NSArray。相信我。 好的,我明白了,我将它从 NSDictionary 更改为 NSArray,它允许我使用 objectAtIndex 函数,然后我可以选择要使用的数据集。现在,我将如何使用 user_id 等于 3016818 的特定字典? 【参考方案1】:

您的字符串代表NSArray,而不是NSDictionary。而且它是一个 JSON 字符串,所以你可以使用 NSJSONSerialization 解析它:

NSString *jsonString = @"..." // your string here

// Create array from json string
NSArray *jsonArray = [NSJSONSerialization
    JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]
               options:NSJSONReadingMutableContainers
                 error:Nil];

// Loop to find your user_id
// Because each child of this array is a dictionary
for (NSDictionary *dic in jsonArray) 
    if ([dic[@"user_id"] isEqual:@3016817])  // user_id field is number
        // Access what you want
        NSString *grade = dic[@"grade"];

        // For "score" you must go deeper
        // Just remember, [] is array and  is dictionary
    

【讨论】:

我现在明白了!我没有在 for 循环中使用 dic[@"grade"] 部分。谢谢!【参考方案2】:

一个简单的方法是

for (NSDictionary* d in theArray) 
    if ([d[@"user_id"] isEqualToString: u]) 
        // do something
    

matt 是对的,它是一个字典数组,不管你声明是什么类型。

【讨论】:

当我将 theArray 更改为字典数组并将“u”设置为我知道存在的 user_id 时,这会导致应用程序崩溃。 因为user_id 字段是数字,而不是字符串。您可以使用isEqual:u 进行比较,uNSNumber【参考方案3】:

你可以使用下面的 NSJsonSerialization 类的方法来创建 NSArray ,它将包含所有的字典。 + (id)JSONObjectWithData:(NSData *)数据选项:(NSJSONReadingOptions)opt 错误:(NSError **)error;

从 JSON 中获取字典数组后,您可以执行以下操作:

NSArray *filteredjsonArr = [jsonArr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"user_id == %@", @"3016818"]];
NSDictionary *dict = [filtered firstObject];
if (dict != nil) 
   NSString *grade = [dict objectForKey:@"grade"];
   NSArray *gradingPeriods = [dict objectForKey:@"grading_periods"];

要访问特定作业的分数和成绩,您需要深入了解 gradingPeriods 数组。

【讨论】:

以上是关于从 NSDictionary 中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

从 NSDictionary 中提取信息

如何从 NSDictionary 中提取一个整数并将其放入一个整数中?

NSDictionary 具有空值

如何在 iOS 中获取音频文件的持续时间?

检查 NSDictionary 中的键 - 不使用布尔 NSNumber 作为值 @iOS8

JSON数据,编辑方式