Проверка схемы JSON 'Требуется' установлена ​​/ удалена с помощью флажка - PullRequest
0 голосов
/ 18 марта 2019

Я занимаюсь разработкой веб-приложения, смоделированного с использованием схемы JSON.Я пытаюсь создать страницу с текстовой областью и флажком.Текстовая область должна объяснить, почему я люблю пиццу.Если пользователь нажимает флажок, он подтверждает, что ему не нравится пицца.Текстовое поле является «обязательным», если флажок не установлен.Флажок эффективно работает как логическое значение, но используемые компоненты не могут быть изменены (потому что так сказал пользователь-исследователь).В настоящее время я использую AJV для проверки моей схемы, и она настроена на выдачу errorMessages.required, когда свойство имеет значение required, но ввод не выбран / не выбран.

К сожалению, я совершенно неопытен, когда дело касается схемы JSON.Ниже моя текущая попытка заставить это проверить.Это отрисовывается правильно, но не работает так, как я хочу - в моей среде разработки это просто что-то проверяет, но на jsonschemavalidator.net оно не будет проверяться, если не установлен флажок.Как достичь желаемой функции?

{
$schema: 'http://json-schema.org/draft-07/schema#',
type: 'object',
additionalProperties: false,
propertyNames: {
    enum: [
        'q-why-i-love-pizza',
        'q-i-hate-pizza'
    ]
},
properties: {
    'q-why-i-love-pizza': {
        type: 'string',
        title: 'If you love pizza, tell us why',
        maxLength: 500,
        errorMessages: {
            required: "Please tell us why you love pizza, or select 'I hate pizza'"
        }
    },
    'q-i-hate-pizza': {
        type: 'array',
        maxItems: 1,
        uniqueItems: true,
        items: {
            anyOf: [
                {
                    title: 'I hate pizza',
                    const: 'hate'
                }
            ]
        },
        errorMessages: {
            required: "Please tell us why you love pizza, or select 'I hate pizza'"
        }
    }
},
allOf: [
    {
        $ref: '#/definitions/if-not-checked-then-q-why-i-love-pizza-is-required'
    }
],
definitions: {
    'if-not-checked-then-q-why-i-love-pizza-is-required': {
        if: {
            not: {
                properties: {
                    'q-i-hate-pizza': {
                        const: 'hate'
                    }
                }
            }
        },
        then: {
            required: ['q-why-i-love-pizza'],
            propertyNames: {
                enum: [
                    'q-i-hate-pizza',
                    'q-why-i-love-pizza'
                    ]
                }
            }
        }
    }
}

РЕДАКТИРОВАТЬ:

Я ожидаю следующего:

{
    'q-why-i-love-pizza' : '',
    'q-i-hate-pizza' : ['']
}

Это должно пройти НЕПРАВИЛЬНУЮ проверку, поскольку никакие значения не были выбраны.

{
    'q-why-i-love-pizza' : 'I love pizza because it's amazing',
    'q-i-hate-pizza' : ['']
}

Это должно ПРОЙТИ, потому что пользователь ввел, почему он любит пиццу, поэтому устанавливать флажок не нужно.

{
    'q-why-i-love-pizza' : '',
    'q-i-hate-pizza' : ['hate']
}

Это должно ПРОЙТИ, потому что, хотя пользователь не сказал нам, почему он любит пиццу, он установил флажок, чтобы указать, что он ненавидит пиццу.

{
    'q-why-i-love-pizza' : 'I am a user, so decided to tell you I hate pizza too',
    'q-i-hate-pizza' : ['hate']
}

Это также должно ПРОЙТИ, потому что мне нужно принять возможность того, чтопользователь поставит галочку, говоря, что ненавидит пиццу, но все равно расскажет мне.

Решение :

{
    type: "object",
    properties: {    
        'q-why-i-love-pizza': {
            type: 'string',
            title: 'If you love pizza, tell us why',
            maxLength: 500,
            errorMessages: {
            required: "Please tell us why you love pizza, or select 'I hate pizza'"
            }
        },
        'q-i-hate-pizza': {
            type: 'array',
            maxItems: 1,
            uniqueItems: true,
            items: {
                anyOf: [
                    {
                        title: 'I hate pizza',
                        const: 'hate'
                    }
                ]    
            },
            errorMessages: {
                required: "Please tell us why you love pizza, or select 'I hate pizza'"
            }
        }
    },
    allOf: [
        { $ref: "#/definitions/if-not-checked-then-q-offender-contact-description-is-required" }
    ],
    definitions: {
        "if-not-checked-then-q-offender-contact-description-is-required": {
            if: {
                not: {
                    required: ["q-i-hate-pizza"]
                }
            },
            then: {
                required: ["q-why-i-love-pizza"]
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Я упростил вашу схему, поэтому она может быть не идеальной, но этот общий подход должен работать.

{
  "type": "object",
  "properties": {
    "q-why-i-love-pizza": { "type": "string", "maxLength": 500 },
    "q-i-hate-pizza": { "const": ["hate"] }
  },
  "allOf": [
    { "$ref": "#/definitions/if-hates-pizza-then-q-why-i-love-pizza-is-required" }
  ],
  "definitions": {
    "if-hates-pizza-then-q-why-i-love-pizza-is-required": {
      "if": { "not": { "required": ["q-i-hate-pizza"] } },
      "then": { "required": ["q-why-i-love-pizza"] }
    }
  }
}
0 голосов
/ 18 марта 2019

Вы прошли большую часть пути, но вы пропустили то, чего не ожидали.

Ваша схема для if-not-checked-then-q-why-i-love-pizza-is-required. Ключевое слово const применимо только к свойству, ЕСЛИ оно существует. Вам необходимо добавить ограничение required в схему if.

Очевидно, это предположительно, поскольку вы не предоставили данные вашего экземпляра JSON.

...