如何从NSJSONSerialization解析的字典数组中提取value为1的day和hour?
筛选NSJSONSerialization返回数组中value为1的条目并提取day和hour
嗨,我来帮你搞定这个需求!你已经通过NSJSONSerialization拿到了目标字典数组,现在要提取所有value为1的条目对应的day和hour,这里有几种实用的实现方式,还帮你处理了数组里那个key不一致的小问题(有个条目用了val而不是value):
方式一:基础循环遍历(直观易懂)
这是最直接的写法,逻辑清晰,适合快速上手:
NSError *parseError = nil; NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&parseError]; // 用来存放筛选后的结果 NSMutableArray *targetEntries = [NSMutableArray array]; if (!parseError && jsonArray) { for (NSDictionary *entry in jsonArray) { // 兼容key为value和val的情况,避免漏掉数据 NSNumber *valueNum = entry[@"value"] ?: entry[@"val"]; // 判断value是否为1 if ([valueNum integerValue] == 1) { // 提取day和hour,存成新字典(也可以替换成自定义模型) NSDictionary *resultDict = @{ @"day": entry[@"day"], @"hour": entry[@"hour"] }; [targetEntries addObject:resultDict]; } } } // 现在targetEntries里就是你要的所有符合条件的day和hour数据 NSLog(@"筛选结果:%@", targetEntries);
方式二:用NSPredicate筛选(更简洁)
如果想让代码更紧凑,可以借助NSPredicate做筛选,不过要先统一数组里的key:
NSError *parseError = nil; NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&parseError]; if (!parseError && jsonArray) { // 先统一字典的key,把val替换成value,避免筛选遗漏 NSArray *normalizedArray = [jsonArray valueForKeyPath:@"@{day:day, hour:hour, value:value ?: val}"]; // 创建筛选条件:value等于1 NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"value == 1"]; NSArray *filteredEntries = [normalizedArray filteredArrayUsingPredicate:filterPredicate]; // 如果只需要day和hour,可以再提取一次 NSArray *finalResult = [filteredEntries valueForKeyPath:@"@{day:day, hour:hour}"]; NSLog(@"最终结果:%@", finalResult); }
小提醒
- 一定要处理JSON解析时的错误(比如
parseError),避免出现意外崩溃; - 你的原始数组里有一个条目用了
val作为key,不是统一的value,所以代码里做了兼容处理,不然会漏掉这条数据; - 如果数据量很大,循环遍历的性能会更稳定,NSPredicate在日常场景下差异不大,但大数据量下可能稍慢一点。
内容的提问来源于stack exchange,提问作者humble_pie
相关产品推荐
相关产品推荐

