You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Tcl json::dict2json无法为字符串值添加引号的问题咨询

Tcl json::dict2json转换字典为JSON时字符串值未加引号的问题解决

问题现象

使用json::dict2json将字典转为JSON时,字符串类型的值没有被添加引号,输出的JSON不符合语法规范:

set myDict [dict create key1 "v1" key2 "v2" key3 "v3"]
set jsonString [json::dict2json $myDict]
puts "$jsonString"

输出结果:

{"key1": v1
,"key2": v2
,"key3": v3
}

原因分析

查看::json::dict2json的源码实现,发现负责为字符串值添加引号的逻辑被硬编码的0 &&强制短路:

if {0 && ![string is double -strict $val]
    && ![regexp {^(?:true|false|null)$} $val]} {

    set val "\"$val\""
}

由于逻辑与运算的短路特性,0 &&会直接让整个if条件结果为假,后续判断非数字、非布尔/Null值的逻辑完全不会执行,导致字符串值始终得不到引号包裹。

解决方法

方法1:修复json::dict2json源码

找到tcllib中json包的dict2json定义文件(通常路径为tcllib/json/json.tcl),将上述if条件中的0 &&删除,修改为:

if {![string is double -strict $val]
    && ![regexp {^(?:true|false|null)$} $val]} {

    set val "\"$val\""
}

修改后重新加载json包,再执行转换即可得到符合规范的JSON输出。

方法2:使用json::write构建JSON(无需修改源码)

如果不想改动源码,可以改用tcllib提供的json::write命令来构建JSON,它会自动处理字符串的引号包裹和特殊字符转义:

package require json::write

set myDict [dict create key1 "v1" key2 "v2" key3 "v3"]
set jsonFields [list]
dict for {key val} $myDict {
    lappend jsonFields $key [json::write string $val]
}
set jsonString [json::write object {*}$jsonFields]
puts $jsonString

输出结果:

{"key1": "v1", "key2": "v2", "key3": "v3"}

内容的提问来源于stack exchange,提问作者lars1595

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:03:20