获取嵌套 JSON 的 NSArray/NSDictionary
Posted
技术标签:
【中文标题】获取嵌套 JSON 的 NSArray/NSDictionary【英文标题】:Get NSArray/NSDictionary for Nested JSON 【发布时间】:2013-11-28 22:39:57 【问题描述】:我有这个 JSON:
"_id" : "class_1",
"schedule" : [
"date" : "1-1-2014",
"subjects" : [
"time_range" : "08:00-10:00",
"subject" : "Sports"
,
"time_range" : "10:00-12:00",
"subject" : "History"
]
,
"date" : "2-1-2014",
"subjects" : [
"time_range" : "08:00-10:00",
"subject" : "Physics"
,
"time_range" : "10:00-12:00",
"subject" : "Chemistry"
,
"time_range" : "10:00-12:00",
"subject" : "Biology"
]
,
"date" : "3-1-2014",
"subjects" : [
"time_range" : "08:00-10:00",
"subject" : "English"
,
"time_range" : "10:00-12:00",
"subject" : "Maths"
]
,
"date" : "4-1-2014",
"subjects" : [
"time_range" : "08:00-10:00",
"subject" : "Spanish"
,
"time_range" : "10:00-12:00",
"subject" : "Choreography"
,
"time_range" : "12:00-14:00",
"subject" : "Music"
,
"time_range" : "14:00-16:00",
"subject" : "Sports"
,
"time_range" : "16:30-18:30",
"subject" : "Religion"
]
]
我想要做的是获得一个 NSArray/NSMutableArray 或 NSDictionary/NSMutableDictionary` 与给定日期的主题。因此,例如,如果我输入日期 4-1-2014,我想获取一个数组或字典,其中包含该日期中包含的 5 个主题。
我想要做的是获得一个 NSArray/NSMutableArray 或 NSDictionary/NSMutableDictionary 以及给定日期的主题。因此,例如,如果我输入日期 1-1-2014,我想获取一个数组或字典,其中包含该日期中包含的 2 个主题。
这是我尝试过的:
//NSDICTIONARY CONTAINING CLASS DATA FOR CLASS ID
NSDictionary *classData =
[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&error];
//NSMUTABLEDICTIONARY CONTAINING SCHEDULE DATA FOR CLASS ID
NSMutableArray *scheduleDatabyClassID = [classData objectForKey:@"schedule"];
//NSMUTABLEARRAY CONTAINING SCHEDULE SUBJECTS OF CLASS ID
NSMutableArray *subjectsDatabyDate =[[NSMutableArray alloc] init] ;
for (NSMutableDictionary *subjectsData in scheduleDatabyClassID )
NSString *subjectsData_temp = [subjectsData objectForKey:@"subjects"];
NSString *schedule_date = [subjectsData objectForKey:@"date"];
NSString *check = @"25-11-2013";
if ([schedule_date isEqualToString:check])
[subjectsDatabyDate addObject:subjectsData_temp];
以下是我想要得到的,但没有手动将索引设置为 0。我想要 subjectDataByDate :例如值 (1-1-2014)。
NSLog(@"subjectsDatabyDate \n %@ ", [subjectsDatabyDate objectAtIndex:0]);
【问题讨论】:
NSJSONSerialization 合一。 将 JSON 解析成字典/数组,然后访问你想要的。 分享您的研究对每个人都有帮助。向我们展示您尝试了什么,为什么它不能满足您的需求以及任何错误消息。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见how to ask 提示:[subjectsData objectForKey:@"subjects"];
是 NSArray
,而不是 NSString
。
有助于理解 NSLog 转储。在用于记录数组和字典的description
格式中,()
字符总是“括号”NS(Mutable)Arrays,
字符总是“括号”NS(Mutable)Dictionarys。有时眼睛会忽略最外面的()
字符,所以你必须训练自己仔细观察。 JSON 总是被“反序列化”成字典和数组的“巢”,如果您了解生成的结构,就很容易“导航”到您想去的地方。
【参考方案1】:
这成功了。正如我所提到的,我需要一个函数来返回一个包含给定日期的 NSArray:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date==%@",@"1-1-2014"];
NSArray *result_wanted = [scheduleDatabyClassID filteredArrayUsingPredicate:predicate];
NSLog(@"THE RESULT \n %@ ", result_wanted);
【讨论】:
【参考方案2】:如果您在许多不同的日期重复执行此操作,我会以某种不同的方式进行。
NSDictionary 是一个键值对类。你的整个 JSON 数据实际上是一个带有键“_id”和“schedule”的字典,而“schedule”有一个数组值。但是查看数据,字典会更合适,例如“1-1-2014”作为键,其余作为数据。所以你可以把整个数组变成一个字典,类似于你自己的代码:
NSMutableDictionary *subjectsDatabyDate =[NSMutableDictionary dictionary] ;
for (NSDictionary *subjectsData in scheduleDatabyClassID )
NSString *schedule_date = [subjectsData objectForKey:@"date"];
subjectsDatabyDate [schedule_date] = subjectsData;
现在您可以非常快速地访问任何日期:
NSDictionary* result_wanted = subjectsDatabyDate [@"1-1-2014"];
不同之处在于访问 NSDictionary 使用哈希表直接到您想要的项目,而“filteredArray”必须遍历整个数组,每次查看约会。
【讨论】:
以上是关于获取嵌套 JSON 的 NSArray/NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章