短划线

时间:2015-12-09 09:09:17

标签: json parsing tcl

使用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对象。

我错过了什么?是否有任何特定的处理方法可以接受元素名称中的“破折号”字符?

1 个答案:

答案 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的工作方式。

这是示例代码,而不是生产级别。