TCL 字典到 JSON
TCL Dict to JSON
我正在尝试将字典转换为 JSON 格式,但没有看到任何使用 TclLib Json 包的简单方法。说,我定义了一个字典如下:
set countryDict [dict create USA {population 300 capital DC} Canada {population 30 capital Ottawa}]
我想将其转换为 json 格式,如下所示:
{
"USA": {
"population": 300,
"captial": "DC"
},
"Canada": {
"population": 30,
"captial": "Ottawa"
}
}
(“人口”是数字,大写是字符串)。我正在使用 TclLib json 包 (https://wiki.tcl-lang.org/page/Tcllib+JSON) 。任何帮助将不胜感激。
您似乎希望的“直接去那里”方法有两个问题:
- Tcl 的类型系统与 JSON 的非常不同;在 Tcl 中,每个 值都是字符串(的子类型),但是JSON 期望对象、数组、数字和字符串完全不同。
capital
变为 captial
。为了额外的乐趣。 (希望这只是您的错别字,但我们会处理的。)
我建议为此使用 rl_json;它是一个功能更强大的包,将 JSON 视为基本类型。 (在查询 JSON 结构时,它甚至做得更好。)
package require rl_json
set result {{}}; # Literal empty JSON object
dict for {countryID data} $countryDict {
rl_json::json set result $countryID [rl_json::json template {{
"population": "~N:population",
"captial": "~S:capital"
}} $data]
# Yes, that was {{ … }}, the outer ones are for Tcl & the inner ones for a JSON object
}
puts [rl_json::json pretty $result]
除了缩进不同外,这几乎完全符合您要求的输出。 $result
是输出的“生产”版本,您可以使用它进行进一步处理,但根本没有多余的空格(当您处理超过 100MB 长的文档时,这是一个很好的选择)。
备注:
最初的 JSON 对象可以这样完成:
set result "{}"
那也可以正常工作(并且是相同的 Tcl 字节码)。
json set
将一个项目放入对象或数组;这正是我们在这里想要的(在 dict for
中检查输入数据)。
json template
采用可选字典,用于将模板中的替换名称映射到值;这对您的用例来说完美。否则我们不得不 dict with data {}
将字典的内容映射到变量中,而当输入数据没有受到严格控制时,这就不够完美了。
json template
的模板参数的内容本身就是 JSON。叶字符串值中的 ~N:
前缀表示“将其替换为来自名为...的替换的数字”,而 ~S:
表示“将其替换为来自名为...的替换的字符串”。还有其他的。
我正在尝试将字典转换为 JSON 格式,但没有看到任何使用 TclLib Json 包的简单方法。说,我定义了一个字典如下:
set countryDict [dict create USA {population 300 capital DC} Canada {population 30 capital Ottawa}]
我想将其转换为 json 格式,如下所示:
{
"USA": {
"population": 300,
"captial": "DC"
},
"Canada": {
"population": 30,
"captial": "Ottawa"
}
}
(“人口”是数字,大写是字符串)。我正在使用 TclLib json 包 (https://wiki.tcl-lang.org/page/Tcllib+JSON) 。任何帮助将不胜感激。
您似乎希望的“直接去那里”方法有两个问题:
- Tcl 的类型系统与 JSON 的非常不同;在 Tcl 中,每个 值都是字符串(的子类型),但是JSON 期望对象、数组、数字和字符串完全不同。
capital
变为captial
。为了额外的乐趣。 (希望这只是您的错别字,但我们会处理的。)
我建议为此使用 rl_json;它是一个功能更强大的包,将 JSON 视为基本类型。 (在查询 JSON 结构时,它甚至做得更好。)
package require rl_json
set result {{}}; # Literal empty JSON object
dict for {countryID data} $countryDict {
rl_json::json set result $countryID [rl_json::json template {{
"population": "~N:population",
"captial": "~S:capital"
}} $data]
# Yes, that was {{ … }}, the outer ones are for Tcl & the inner ones for a JSON object
}
puts [rl_json::json pretty $result]
除了缩进不同外,这几乎完全符合您要求的输出。 $result
是输出的“生产”版本,您可以使用它进行进一步处理,但根本没有多余的空格(当您处理超过 100MB 长的文档时,这是一个很好的选择)。
备注:
最初的 JSON 对象可以这样完成:
set result "{}"
那也可以正常工作(并且是相同的 Tcl 字节码)。
json set
将一个项目放入对象或数组;这正是我们在这里想要的(在dict for
中检查输入数据)。json template
采用可选字典,用于将模板中的替换名称映射到值;这对您的用例来说完美。否则我们不得不dict with data {}
将字典的内容映射到变量中,而当输入数据没有受到严格控制时,这就不够完美了。json template
的模板参数的内容本身就是 JSON。叶字符串值中的~N:
前缀表示“将其替换为来自名为...的替换的数字”,而~S:
表示“将其替换为来自名为...的替换的字符串”。还有其他的。