json - TCL 字典转 JSON

标签 json dictionary tcl

我正在尝试将字典转换为 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"
  }
}

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

最佳答案

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

  1. Tcl 的类型系统与 JSON 的非常不同;在 Tcl 中,每个值都是字符串(的子类型),但 JSON 期望对象、数组、数字和字符串是完全不同的东西。
  2. 资本变为资本。为了奖金的乐趣。 (希望这只是您的拼写错误,但我们会处理的。)

我建议使用 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 模板 的模板参数内容本身就是 JSON。叶字符串值中的 ~N: 前缀表示“将其替换为名为…的替换中的数字”,而 ~S: 表示“将其替换为来自替换的字符串”替代品称为……”。还有其他的。

关于json - TCL 字典转 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67315843/

相关文章:

javascript - 如何将 JSON 数据从客户端发送到 Node.js 服务器。

Linux Telnet vt100 回车键发送^M

java - Kafka-Streams 加入 2 个带有 JSON 值的主题 |背压机制?

java - 使用 Gson 反序列化有时是字符串有时是对象

javascript - 如果 id 不在使用 jQuery 的 JSON 中,如何隐藏 li 标签?

automation - ssh 到 unix 服务器的脚本

c++ - Tcl API 如何从 Tcl 获取列表

string - 我有一个向量,例如 (1,2,3,4),我想将数字更改为字符串

python - 从字典列表中获取特定的键和值

java - 将 Duplicate Key 的所有值存储在 Map 中