ajv-validator / ajv-cli

Command-line interface for Ajv JSON Validator
https://ajv.js.org
MIT License
262 stars 66 forks source link

Improve data type determination for the key words “oneOf” and “allOf” #224

Open Markus-Elfring opened 1 year ago

Markus-Elfring commented 1 year ago

I constructed the following JSON schema file.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Calculation information",
  "description": "settings for calculations",
  "$id": "https://example.com/schemas/calculation_preferences",
  "type": "object",
  "required": ["context"],
  "properties":
  {
    "context":
    {
      "type": "object",
      "oneOf":
      [
        {
          "allOf":
          [
            {
              "properties":
              {
                "label": {"const": "GTIN"}
              }
            },
            {
              "type": "array",
              "minItems": 1,
              "items":
              {
                "type": "string",
                "pattern": "^[0-9]{13}$"
              }
            }
          ]
        },
        {
          "allOf":
          [
            {
              "properties":
              {
                "label": {"const": "selection group"}
              }
            },
            {
              "type": "array",
              "minItems": 1,
              "items":
              {
                "type": "string",
                "minLength": 1
              }
            }
          ]
        }
      ]
    }
  }
}

Test data example:

{
  "context":
  {
    "GTIN": [ "1234567890123" ]
  }
}

:thought_balloon: Now I am wondering about the following error information.

Markus_Elfring@…:…> ajv validate --strict=false --spec=draft2020 -s Berechnung-Kontext-Testfragment1-Schema2 -d Context-test_fragment1.json
Context-test_fragment1.json invalid
[
  {
    instancePath: '/context',
    schemaPath: '#/properties/context/oneOf/0/allOf/1/type',
    keyword: 'type',
    params: { type: 'array' },
    message: 'must be array'
  },
  {
    instancePath: '/context',
    schemaPath: '#/properties/context/oneOf/1/allOf/1/type',
    keyword: 'type',
    params: { type: 'array' },
    message: 'must be array'
  },
  {
    instancePath: '/context',
    schemaPath: '#/properties/context/oneOf',
    keyword: 'oneOf',
    params: { passingSchemas: null },
    message: 'must match exactly one schema in oneOf'
  }
]

:thinking: I would appreciate further advices and solution ideas for safer data processing.