JSON:对于 JSON 和 JSON Schema,是不是有等效的 Schematron? (即一种表示协约束的JSON技术)
Posted
技术标签:
【中文标题】JSON:对于 JSON 和 JSON Schema,是不是有等效的 Schematron? (即一种表示协约束的JSON技术)【英文标题】:JSON: Is there an equivalent of Schematron for JSON and JSON Schema? (That is, a JSON technology to express co-constraints)JSON:对于 JSON 和 JSON Schema,是否有等效的 Schematron? (即一种表示协约束的JSON技术) 【发布时间】:2015-04-22 03:20:54 【问题描述】:这是一个显示会议开始时间和结束时间的 JSON 实例:
"start time": "2015-02-19T08:00:00Z",
"end time": "2015-02-19T09:00:00Z"
我可以使用 JSON Schema 指定该实例的结构:该实例必须包含一个具有“开始时间”属性和“结束时间”属性的对象,并且每个属性都必须是日期时间格式的字符串。有关 JSON 架构,请参见下文。但我不能具体说明的是:会议必须在结束之前开始。即“开始时间”的值必须小于“结束时间”的值。有些人称这种数据依赖性为共同约束。在 XML 世界中,有一种用于表达共同约束的美妙而简单的技术:Schematron。我想知道 JSON 世界中是否有等效的技术?你会用什么来以声明方式描述“开始时间”和“结束时间”的值之间的关系? (注意:用某种编程语言编写代码不是我所说的“以声明方式描述关系”。我正在寻找一种声明方式来描述 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"
【问题讨论】:
不完全是您要查找的内容,但您可以先将 JSON 数据转换为 XML,然后再对其应用任何 Schematron 规则?支持两者的工具是XML ValidatorBuddy 【参考方案1】:是的。有一个基于 Schematron 的 JSON 语义验证器,可在以下位置获得: https://www.npmjs.com/package/jsontron
它实现了'schema'、'phase'、'rule'、'assert'和报告Schematron 的功能。
这是通过验证器运行开始时间和结束时间的原始示例的时间:
good_time.json 文件内容:
"starttime": "2015-02-19T08:00:00Z",
"endtime": "2015-02-19T09:00:00Z"
bad_time.json 文件内容:
"starttime": "2015-02-19T09:00:00Z",
"endtime": "2015-02-19T08:00:00Z"
Schematron 规则文件meeting-times-rules.json sn-p:
"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 .........
带有调试选项的消息是:
...validation failed...
message: 'Meeting cannot end before it starts'
【讨论】:
jsontron 语法看起来有些丑陋...也许在未来jsontron development 可以使用JSON Pointer 更好的路径语法,以及现代javascript@ 更好的通用语法987654324@。它需要与json-schema 兼容,因为在 XML 中它们的 schema 和 schematron 是互补的。【参考方案2】:很遗憾,答案是否定的。 JSON Schema 允许您验证结构和允许的值,但没有用于验证值集的机制,a'la Schematron。
解决此问题的最简单方法是在管道中使用另一个脚本来运行此类检查。
【讨论】:
答案是“是”,检查@Amer 的 jsontron (!)...好吧,这似乎是一个很好的起点,可以演变为标准或参考实现。今天需要一些社区测试来确认这是一个“验证值集的机制,a'la Schematron”。【参考方案3】:Oxygen JSON 编辑器中有一个实现,允许您根据 Schematron 验证 JSON 文档。 https://www.oxygenxml.com/doc/versions/22.0/ug-editor/topics/json-validating-documents-against-schema.html
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>
https://www.slideshare.net/nottavy/schematron-for-nonxml-languages
【讨论】:
【参考方案4】:json-schema.org 网站列出了很多实现。
【讨论】:
该页面上的任何内容都与有关 schematron 的问题无关。以上是关于JSON:对于 JSON 和 JSON Schema,是不是有等效的 Schematron? (即一种表示协约束的JSON技术)的主要内容,如果未能解决你的问题,请参考以下文章