JSON:对于JSON和JSON模式,是否有一个与Schematron等价的东西?(也就是说,一种用于表示共同约束的JSON技术)

JSON:对于JSON和JSON模式,是否有一个与Schematron等价的东西?(也就是说,一种用于表示共同约束的JSON技术),json,dependencies,schema,schematron,Json,Dependencies,Schema,Schematron,下面是一个JSON实例,显示会议的开始时间和结束时间: { "start time": "2015-02-19T08:00:00Z", "end time": "2015-02-19T09:00:00Z" } 我可以使用JSON模式指定该实例的结构:该实例必须包含一个具有“开始时间”属性和“结束时间”属性的对象,并且每个属性必须是日期时间格式的字符串。请参见下面的JSON模式。但我不能具体说明的是:会议必须在结束前开始。也就是说,“开始时间”的值必须小于“结束时间”的值。有些人

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

{
    "start time": "2015-02-19T08:00:00Z",
    "end time": "2015-02-19T09:00:00Z"
}
我可以使用JSON模式指定该实例的结构:该实例必须包含一个具有“开始时间”属性和“结束时间”属性的对象,并且每个属性必须是日期时间格式的字符串。请参见下面的JSON模式。但我不能具体说明的是:会议必须在结束前开始。也就是说,“开始时间”的值必须小于“结束时间”的值。有些人将这种数据依赖性称为协同约束。在XML世界中,有一种极好的、简单的技术来表达共同约束:Schematron。我想知道JSON世界中是否有一种同等的技术?您会用什么来声明性地描述“开始时间”和“结束时间”之间的关系?(注意:用某些编程语言编写代码并不是我所说的“声明性地描述关系”的意思。我正在寻找一种声明性的方法来描述JSON文档中存在的数据依赖关系,而不是过程代码。)


该网站列出了许多实现。

遗憾的是,答案是否定的。JSON模式允许您验证结构和允许的值,但没有验证值集的机制,a'la Schematron


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

是的。基于SchematronJSON语义验证程序可在以下位置获得:

它实现了Schematron的“schema”、“phase”、“rule”、“assert”和报告功能

下面是通过验证器运行开始时间和结束时间的原始示例:

good_time.json文件内容:

{
"starttime": "2015-02-19T08:00:00Z",
"endtime": "2015-02-19T09:00:00Z"
}
{
"starttime": "2015-02-19T09:00:00Z",
"endtime": "2015-02-19T08:00:00Z"
}
错误的\u time.json文件内容:

{
"starttime": "2015-02-19T08:00:00Z",
"endtime": "2015-02-19T09:00:00Z"
}
{
"starttime": "2015-02-19T09:00:00Z",
"endtime": "2015-02-19T08:00:00Z"
}
Schematron规则文件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 .........
当运行坏数据示例时。结果是:

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 .........
带有调试选项的消息为:

...validation failed...
message: 'Meeting cannot end before it starts'

氧气JSON编辑器中有一个实现,允许您根据Schematron验证JSON文档。

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

<!-- The 'genre' property should be none but one of the items declared in 'literatureGenres' property -->
<sch:rule context="genre">
    <sch:let name="genre" value="text()"/>
    <sch:let name="literatureGenres" value="//literatureGenres/text()"/>
    <sch:assert test="normalize-space($genre) = $literatureGenres">    
        Wrong genre: '<sch:value-of select="$genre"/>'. See the 'literatureGenres' property for the permitted ones.
    </sch:assert>    
</sch:rule>

错误类型:“”。有关允许的类型,请参阅“文学类型”属性。

不完全是您想要的,但您可以先将JSON数据转换为XML,然后再对其应用任何Schematron规则?如果一个工具同时支持这两种功能,那么该页面上的任何内容都与schematron的问题无关。。。也许将来可以通过使用更好的路径语法,通过现代Javascript使用更好的通用语法。它需要与XML兼容,因为在XML中,schema和schematron是互补的。。。这似乎是一个很好的起点,可以发展为标准或参考实现。现在需要一些社区测试来确认这是一种“验证值集的机制,a'la Schematron”。