找出所有密钥的值,而不提及tcl

时间:2018-04-19 13:04:16

标签: json tcl

我对tcl很新。在我的实现中,我的输入是一个嵌套的json文件。我需要将值与键一起存储在txt文件中。 我将json文件转换为dict,然后使用http://wiki.tcl.tk/13419中的 jsonget ,我可以提供密钥并且非常容易地迭代地找到每个密钥的值。 现在,我的问题是,我的json文件可能会在以后更新。因此,我不知道json中添加了哪个键,因此我也无法获得这些值。 我的代码必须是通用的,并且必须适用于所有这些动态json文件,它必须能够提供所有这些键及其值。

例如

{"test":[{"a":1,"b":2}]} }

result: 
a 1
b 2

{"test":[{"a":1,"b":2,"c":3}]}

result: 
a 1 
b 2
c 3

{"test":[{"a":1,"b":2,"c":[{"d":4,"e":5}]]}

result: 
a 1
b 2
c d 4 
  e 5

所有这些,无需更改代码。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您的示例和您的措辞(“要求”)都不是特别有用。我只能对您的意图进行二次猜测:您是否想知道如何编写一段Tcl,以一般(常规)方式重复处理JSON文档的选定内容,而不知道其结构或实际文字内容(例如,关键标签)?

如果是,......

...这有帮助吗?

proc foo {json} {
    foreach k [dict keys [lindex [dict get $json test] 0]] {
       puts "$k => [jsonget $json test 0 $k]"
    }
}

foo [json::json2dict { {"test":[{"a":1,"b":2}]} }];

foo [json::json2dict { {"test":[{"a":1,"b":2,"c":3}]} }];

foo [json::json2dict { {"test":[{"a":1 }]}}];

它并没有给格伦指出的东西增加太多。

如果不是,......

...改进你的例子,措辞。

一般建议

对于基于JSON的严肃开发,请考虑rl_jsontdom