关于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
相关产品推荐
相关产品推荐

