有没有办法在目标 C 中循环遍历 nsdictionary,其中键值未知且字典深度嵌套
Posted
技术标签:
【中文标题】有没有办法在目标 C 中循环遍历 nsdictionary,其中键值未知且字典深度嵌套【英文标题】:Is there a way to loop through nsdictionary in objective C where key values are not known and the dictionary is deeply nested 【发布时间】:2017-11-06 06:54:48 【问题描述】:有没有办法在目标 C 中循环遍历 nsdictionary,其中键值未知且字典嵌套很深。有人可以帮忙吗?我搜索了很多找不到明确的解决方案。 我会得到一个 JSON 字符串,我将它移动到一个 NSDictinary 变量中,这里有些值是加密的,有些不是。我只需要解密 json 的某些部分。我知道我需要解密哪个键值对。 (这也是 json 字符串的一部分,即在外部嵌套中可用)。但是对于每个 JSON 响应,字符串都会改变,所以我不知道加密的键值对在哪里。我只知道键名。所以我需要遍历整个 json 并找到要解密的密钥对。 json也嵌套很深。
您好,感谢您的回复,这里是示例 json
这是一个示例 json(不是确切的字符串)
"DTLS": [
“VALUE1”: “ASsddcFF12223fdvfvfvffrefcdcssss”
,
"VALUE2”: “sdsdd2323edffvfvb4ddcdccvvvrfdc”
,
"VALUE3”: "sdsdd2323edffvfvb4ddcdccvvvrfdc"
,
],
"Decryptkeys":"VALUE1|VALUE2|VALUE3"
"isSuccessful": true,
"responseTime": 2014,
"totalTime": 2014,
"responseCode": "S",
"statusCode": 200
上述响应可能会在另一个服务器调用中发生变化,其中 DTLS 可以嵌套在另一个 json 密钥(如 MAINDTLS)中,因此我可以盲目采用的唯一密钥是 Decryptkeys。我知道这会在哪里。但是 Decryptkeys 中的那些,即 VALUE1、VALUE2、VALUE3 可能嵌套在 json 深处的某个地方。
【问题讨论】:
您的问题不清楚。如果您在此处发布您的 JSON 响应以及您想要的密钥作为示例,那就更好了。 请举例说明您遇到的字典问题。我不能仅仅通过阅读你的解释来发表任何评论 感谢大家的回复。我已经修改了问题。 【参考方案1】:检查这个答案:
如何在objective-c iphone sdk中迭代嵌套字典
https://***.com/a/40942013/2432053
编辑
这里是修改版:
- (id)findflat:(NSString *)keyToFind
if([self objectForKey:keyToFind])
return self[keyToFind];
for(id key in self.allKeys)
if ([self[key] isKindOfClass:[NSArray class]])
for (id obj in self[key])
if ([obj isKindOfClass:[NSDictionary class]])
id res = [obj findflat:keyToFind];
if (res)
return res;
return nil;
【讨论】:
如果我通过“DTLS”它成功搜索它,如果我通过VALUE1它返回nil。【参考方案2】:前两个 if 条件检查 value 是字典还是数组,如果是,则必须对其进行解析。 最后一个 if 条件 if ([self respondsToSelector:NSSelectorFromString(key)]) 这就是您获得价值的地方。
在我的例子中,我有一个自定义的 NSObject,我在这里做的是检查这个对象是否响应特定的键,然后我正在设置值...
在你的情况下,我相信最后一个 if 条件应该检查密钥是否是 DTLS...然后做你的事情
希望这会有所帮助...
-(void)parseDictionary:(NSDictionary*)dict
for (NSString *key in dict)
if([[dict valueForKey:key] isKindOfClass:[NSDictionary class]])
[self parseDictionary:[dict valueForKey:key]];
else if([[dict valueForKey:key] isKindOfClass:[NSArray class]])
for (NSDictionary* object in [dict valueForKey:key])
[self parseDictionary:object];
else if ([self respondsToSelector:NSSelectorFromString(key)])
[self setValue:[dict valueForKey:key] forKey:key];
【讨论】:
非常感谢,但上述解决方案完美运行。无论如何,谢谢。以上是关于有没有办法在目标 C 中循环遍历 nsdictionary,其中键值未知且字典深度嵌套的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 foreach 循环中遍历命名空间中的所有类型? [复制]