有没有办法在目标 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,其中键值未知且字典深度嵌套的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不使用pairs()的情况下循环遍历数组?

有没有办法在 foreach 循环中遍历命名空间中的所有类型? [复制]

如何循环遍历数组并取消设置数组中的变量

循环遍历 .resx 文件中的所有资源

有没有办法在 Powershell 中创建一个数组并在 Azure DevOps YAML 中循环遍历它?

有没有办法在不使用游标的情况下循环遍历 SQL 中的表变量?