TCL Dict to JSON



我正在尝试将dict转换为JSON格式,但没有看到任何使用TclLib-JSON包的简单方法。比方说,我定义了一个dict如下:

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"
  }
}

("population"是数字,大写是字符串(。我正在使用TclLib json包(https://wiki.tcl-lang.org/page/Tcllib+JSON(。任何帮助都将不胜感激。

您似乎希望的"直接去那里"方法有两个问题:

  1. Tcl的类型系统与JSON的类型系统极为不同;在Tcl中,每个值都是字符串的(子类型(,但JSON期望对象、数组、数字和字符串具有完全不同的特性
  2. CCD_ 1变为CCD_。为了额外的乐趣。(希望这只是你的拼写错误,但我们会处理的。(

我建议使用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:前缀表示"将其替换为来自名为…的替换的数字",capital0表示"将此替换为来自称为…的替代的字符串"。还有其他的。

最新更新