获取嵌套 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的主要内容,如果未能解决你的问题,请参考以下文章

从没有名称Android的嵌套数组JSON获取数据

无法从 json-server 获取嵌套的对象数组

使用 System.Text.Json 获取嵌套属性

获取嵌套 JSON 的 NSArray/NSDictionary

json数组嵌套数组

如何获取嵌套在laravel中的json