JSON:对于JSON和JSON Schema,是否有相当于Schematron的东西? (也就是说,表达共同约束的JSON技术)

时间:2015-02-20 12:32:16

标签: json dependencies schema schematron

这是一个JSON实例,显示会议的开始时间和结束时间:

{
    "start time": "2015-02-19T08:00:00Z",
    "end time": "2015-02-19T09:00:00Z"
}

我可以使用JSON Schema指定该实例的结构:实例必须包含一个带有"开始时间"财产和结束时间"属性和每个属性必须是日期时格式的字符串。请参阅下面的JSON模式。但我无法指明的是:会议必须在会议结束前开始。也就是说,"开始时间"必须小于"结束时间"的值。有些人将这种数据依赖性称为共同约束。在XML世界中,有一种用于表达共同约束的精彩,简单的技术:Schematron。我想知道JSON世界中是否有相同的技术?您将使用声明性地来描述"开始时间"的值之间的关系。和#34;结束时间"? (注意:用某种编程语言编写代码 not 我的意思是"声明性地描述关系"。我正在寻找一种声明方法来描述JSON中存在的数据依赖关系文件,而不是程序代码。)

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "meeting": {
            "type": "object",
            "properties": {
                "start time": { "type": "string", "format": "date-time"},
                "end time": { "type": "string", "format": "date-time"}
            },
            "required": [ "start time", "end time" ],
            "additionalProperties": false
        }
    },
    "$ref": "#/definitions/meeting"
}

4 个答案:

答案 0 :(得分:2)

是的。有一个基于 Schematron JSON语义验证器https://www.npmjs.com/package/jsontron

它实现“ 模式”,“ 阶段”,“ 规则”,“ 断言”和报告Schematron的功能。

这是通过验证程序运行开始时间和结束时间的原始示例的时间:

good_time.json 文件内容:

elif op == "*":
   ^

bad_time.json 文件内容:

{
"starttime": "2015-02-19T08:00:00Z",
"endtime": "2015-02-19T09:00:00Z"
}

Schematron规则文件 meeting-times-rules.json 片段:

{
"starttime": "2015-02-19T09:00:00Z",
"endtime": "2015-02-19T08:00:00Z"
}

使用正确的示例运行时:

        "rule":[
            {          
            "context": "$",
            "assert":[
              {
                 "id":"start_stop_meeting_chec",
                 "test":"jp.query(contextNode, '$..starttime') < jp.query(contextNode, '$..endtime')",
                 "message": "Meeting cannot end before it starts"
              }
            ]              
         }
        ]

输出为:

$jsontron\bin>node JSONValidator -i ./good_time.json -r ./meeting-times-rules.json

以错误的数据示例运行时。输出为:

Starting Semantic Validation .........
Parsing Pattern: Meetingtimings
1 Pattern(s) Requested. 1 Pattern(s) Processed. 0 Pattern(s)  Ignored.
**** THIS INSTANCE IS SEMANTICALLY VALID ****
Completed Semantic Validation .........

带有调试选项的消息是:

$jsontron\bin>node JSONValidator -i ./bad_time.json -r ./meeting-times-rules.json
Starting Semantic Validation .........
Parsing Pattern: Meetingtimings
1 Pattern(s) Requested. 1 Pattern(s) Processed. 0 Pattern(s)  Ignored.
**** THIS INSTANCE CONTAINS SEMANTIC VALIDATION ISSUES. PLEASE SEE FULL REPORT BY ENABLING DEBUG WITH -d OPTION ****
Completed Semantic Validation .........

答案 1 :(得分:1)

可悲的是,答案是否定的。 JSON Schema允许您验证结构和允许的值,但是没有用于验证值集的机制,即Schematron。

解决此问题的最简单方法是在管道中使用另一个脚本来运行这些检查。

答案 2 :(得分:1)

Oxygen JSON编辑器中有一个实现,使您可以根据Schematron验证JSON文档。 https://www.oxygenxml.com/doc/versions/22.0/ug-editor/topics/json-validating-documents-against-schema.html

使用XPath表达式表示Schematron规则,并在JSON文档中报告问题。

daySpeed

https://www.slideshare.net/nottavy/schematron-for-nonxml-languages

答案 3 :(得分:-1)

json-schema.org网站列出了不少实现。