检查嵌套 json 响应的值

Posted

技术标签:

【中文标题】检查嵌套 json 响应的值【英文标题】:Check value of nested json response 【发布时间】:2013-08-23 14:23:40 【问题描述】:

我想根据当天的时间从我的 google 地方 json 响应中获取关闭时间。这行代码给了我一个 0-6 的值表示一周中的当前日期。

NSString *dayOfWeek = [myFormatter stringFromDate:today];

我有一个 NSArray 来存储 google places 响应的结果。

NSArray* periods= [[place objectForKey:@"opening_hours"]objectForKey:@"periods"];

句点数组中的 json 响应如下所示。

Period RESULT (
        
        close =         
            day = 0;
            time = 2300;
        ;
        open =         
            day = 0;
            time = 1100;
        ;
    ,
        
        close =         
            day = 1;
            time = 2300;
        ;
        open =         
            day = 1;
            time = 1100;
        ;
    ,
        
        close =         
            day = 2;
            time = 2300;
        ;
        open =         
            day = 2;
            time = 1100;
        ;
    ,
        
        close =         
            day = 3;
            time = 2300;
        ;
        open =         
            day = 3;
            time = 1100;
        ;
    ,
        
        close =         
            day = 4;
            time = 2300;
        ;
        open =         
            day = 4;
            time = 1100;
        ;
    ,
        
        close =         
            day = 5;
            time = 2300;
        ;
        open =         
            day = 5;
            time = 1100;
        ;
    ,
        
        close =         
            day = 6;
            time = 2300;
        ;
        open =         
            day = 6;
            time = 1100;
        ;
    
)

如何使用我的 dayOfWeek 值来检查 period 数组的正确 close.time?

【问题讨论】:

实际上,你上面的不是 JSON,而是包含反序列化 JSON 的 NSArray 的“描述”(NSLog)。数组包含 NSDictionary,数组中的每个 NSDictionary 又包含两个 NSDictionary。如果您完全了解如何编程,那么遍历数组、查看每个条目并进行所需的检查应该是一件简单的事情。 (你试过什么?) (如果你不能自己解决这个问题,你需要暂时搁置 Objective-C 并用 Java 或类似的东西做更多的教育。) 谢谢。我了解该数组包含 NSDictionarys,并且我了解我需要了解更多信息 - 正在进行中。我希望在这里提出一个问题来帮助这个过程。我尝试过的大部分内容都围绕使用 if (![periods containsObject:dayOfWeek]) [periods addObject:valueForKeyPath:@"close.time"]; 提示:写一个循环。提取每个数组元素。 NSLog它。然后决定如何处理它。重复。这就是我在处理复杂 JSON 时所做的(当然不是,但过程仍然有效。) 【参考方案1】:
for( NSDictionary *d in periods )
  NSInteger day = [[[d objectForKey:@"close"] objectForKey:@"day"] integerValue];

  if( day == [dayOfWeek integerValue] )
    return [[[d objectForKey:@"close"] objectForKey:@"time"] integerValue];
  

【讨论】:

【参考方案2】:

您可以这样做的一种方法是利用NSPredicate 和Key-Value Coding:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"close.day = %@", dayOfWeek];
NSArray *output = [periods filteredArrayUsingPredicate:predicate];
NSNumber *closingTime = [output.lastObject valueForKeyPath:@"close.time"];

【讨论】:

谢谢,这似乎是一个很好的解决方案,但我得到 (null) 用于关闭时间,进一步检查是因为输出数组是空的,即使响应包含应该在该数组中的对象. 嗯,我使用基于您发布的 JSON 构建的数组检查了这一点。 如果日期类型是 NSNumber,那么您需要将谓词更改为 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"close.day = %d", dayOfWeek.intValue];

以上是关于检查嵌套 json 响应的值的主要内容,如果未能解决你的问题,请参考以下文章

如何基于相等性检查在 Spark 中使用内部数组查询嵌套 json

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

映射嵌套 JSON 时如何检查 NULL?

我无法从JSON响应访问密钥,但可以看到其所有密钥

从 JSON 响应设置 NSDictionary 中的值

JMeter之检查点(JSON断言)