从 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
进行比较,u
是NSNumber
。【参考方案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 中提取一个整数并将其放入一个整数中?