使用tcl,可以创建和解析json对象 但是如果元素名称包含短划线( - ),则创建的字符串不再被视为有效的Json对象
set jsonStr {{
"Image": {
"Width": 800,
"Height": 600,
"Title": "View from 15th Floor",
"Thumbnail": {
"Url": "http://www.example.com/image/481989943",
"Height": 125,
"Width": 100
},
"Animated" : false,
"IDs": [116, 943, 234, 38793],
"valid-access" : [
]
}
} }
set valid_obj [::json:object? $jsonStr ]
puts "is object $valid_obj \n"
在这种情况下,valid_obj等于'0'。当我把“validaccess”而不是“valid-access”时,它工作正常,我可以毫无问题地解析json对象。
我错过了什么?是否有任何特定的处理方法可以接受元素名称中的“破折号”字符?
答案 0 :(得分:1)
我不知道命令::json:object?
来自哪里(也许是here?),但它似乎不是Tcllib中json
包的一部分。 这也是错误的; 您的JSON对象是正确的。
相比之下,如果我使用Tcllib的包:
package require Tcl 8.6
package require json 1.2
set jsonStr {{
"Image": {
"Width": 800,
"Height": 600,
"Title": "View from 15th Floor",
"Thumbnail": {
"Url": "http://www.example.com/image/481989943",
"Height": 125,
"Width": 100
},
"Animated" : false,
"IDs": [116, 943, 234, 38793],
"valid-access" : [
]
}
} }
puts [json::json2dict $jsonStr]
然后我得到了这个输出:
Image {Width 800 Height 600 Title {View from 15th Floor} Thumbnail {Url http://www.example.com/image/481989943 Height 125 Width 100} Animated false IDs {116 943 234 38793} valid-access {}}
对我来说看起来完全正确。
实际上,查看该Wiki页面表明这确实是您从中获取代码的地方。这个例子非常相似。修复该代码将是将[string is wordchar $k]
的定义中的object?
更改为[regexp {^[-\w]+$} $k]
。虽然它仍然有点狡猾; JSON密钥可以合法地包含(几乎)任何字符。真正的限制是因为同一页面上json::select
的工作方式。
这是示例代码,而不是生产级别。