JSON: есть ли аналог Schematron для JSON и схемы JSON? (То есть технология JSON для выражения совместных ограничений)

Вот экземпляр JSON, показывающий время начала и окончания встречи:

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

Я могу указать структуру этого экземпляра с помощью схемы JSON: экземпляр должен содержать объект со свойством «время начала» и свойством «время окончания», и каждое свойство должно быть строкой в ​​формате даты и времени. См. ниже схему 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"
}

person Roger Costello    schedule 20.02.2015    source источник
comment
Не совсем то, что вы ищете, но вы можете сначала преобразовать данные JSON в XML, а затем применить к ним любые правила Schematron? Инструментом, поддерживающим обе функции, является XML ValidatorBuddy.   -  person Clemens    schedule 24.02.2015


Ответы (4)


Да. Существует семантический валидатор JSON на основе Schematron, доступный по адресу: https://www.npmjs.com/package/jsontron

Он реализует 'schema', 'фазу', '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 Rules meeting-times-rules.json:

        "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'
person Amer    schedule 16.10.2018
comment
Синтаксис jsontron кажется чем-то уродливым... Возможно, в будущем разработка jsontron может использовать лучший синтаксис пути с помощью указатель JSON и лучший общий синтаксис с помощью современного Javascript назначения деструктурирования. Нужна некоторая совместимость с json-schema, так как в XML схема и схематрон дополняют друг друга. - person Peter Krauss; 31.12.2018

К сожалению, нет. JSON Schema позволяет проверять структуру и разрешенные значения, но нет механизмов проверки наборов значений, а-ля Schematron.

Самый простой способ решить эту проблему — иметь в конвейере еще один скрипт, который запускает такие проверки.

person jasiek    schedule 17.08.2016
comment
Ответ - да, проверьте jsontron @Amer (!)... Что ж, кажется хорошей отправной точкой и может развиваться до стандартной или эталонной реализации. Сегодня нужно несколько тестов сообщества, чтобы подтвердить, что это механизм проверки наборов значений, а-ля Schematron. - person Peter Krauss; 31.12.2018

В редакторе Oxygen JSON есть реализация, позволяющая проверять документы JSON на соответствие Schematron. 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

person Octavian    schedule 21.02.2020

На веб-сайте json-schema.org перечислены несколько реализаций.

person Liosan    schedule 29.05.2015
comment
Ничто на этой странице не имеет отношения к вопросу о схематроне. - person bazzargh; 23.06.2017