У меня есть следующая схема JSON, которая требует как id
а также content
но по умолчанию последний пустой строкой.
{
"type": "object",
"properties": {
"id": { "type": "string" },
"content": { "type": "string", "default": "" }
},
"required": [ "id", "content" ],
"additionalProperties": false
}
Я пытаюсь проверить следующую строку JSON:
{
"id": "some id"}
Для этого у меня есть следующий код:
rapidjson::Document document;
document.Parse(schemaJson.c_str());
rapidjson::SchemaDocument schemaDocument(document);
rapidjson::SchemaValidator validator(schemaDocument);
rapidjson::Document modelDoc;
modelDoc.Parse(modelJson.c_str());
modelDoc.Accept(validator); // Complains about missing property
Вызов accept не проходит проверку, хотя свойство имеет значение по умолчанию.
Документация по схеме RapidJSON утверждает, что это соответствует JSON Schema draft 4.
Кто-нибудь знает, что я могу делать не так?
Благодарю.
На сегодняшний день ваша говядина с Спецификация проверки схемы JSON, не с RapidJSON:
4,3. Значения по умолчанию для пропущенных ключевых слов
Некоторые ключевые слова, если отсутствуют, МОЖЕТ реализации должны рассматриваться как имеющие значение по умолчанию. В этом случае будет указано значение по умолчанию.
Следствие: процессор разрешено игнорировать недостающие значения, даже если они имеют default
предоставленная стоимость и по-прежнему соответствовать спецификации проверки JSON-схемы
5.4.3.2. Условия для успешной проверки
Экземпляр объекта действителен для этого ключевого слова если его набор свойств содержит все элементы в значении массива этого ключевого слова.
Следствие: валидатор не должен игнорировать отсутствующие, но обязательные свойства.
Положите два вместе, и что дает? RapidJSON все еще может претендовать на соответствие валидации схемы JSON, даже если он не учитывает default
значения для required
свойства во время проверки схемы.
Вы все еще можете подать запрос на улучшение в страница вопросов проекта RapidJson
Это была бы подходящая схема для того, чего вы пытаетесь достичь.
{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {},
"id": "example",
"properties": {
"content": {
"default": "1",
"id": "/properties/content",
"type": "string"},
"id": {
"id": "/properties/id",
"type": "string"}
},
"required": [
"content",
"id"],
"type": "object",
"additionalProperties": false
}
Также я читаю Вот Понимание схемы JSON, что многие валидаторы JSON Schema сразу игнорируют default
ключевое слово. Может быть, вам лучше не использовать его.
С последним тянуть запрос RapidJSON больше не будет missing property
ошибка, если и когда "default"
значение (строка ненулевой длины) указывается в схеме. Видеть это модульный тест В качестве примера.
Напоминаем, что это обновление только отключает сообщение об ошибке и не заполняет значение по умолчанию для проверяемого документа. Пользователь может извлечь значение из схемы, если такое поведение желательно.
Я только что попробовал несколько онлайн-валидаторов. Они также опровергают ваш пример.
Я предложу вам удалить "content"
в "required"
, если это то, что вы хотите.