Search code examples
jsonschemajson-schema-validatorpython-jsonschema

json-schema : Get a list of additionalProperties?


Is it possible to get a list of all additionalProperties found by json-schema ?

For example, if my schema looks like this :

{
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string",
    },
    "lastName": {
      "type": "string",
    },
    "age": {
      "type": "integer"
    }
  }
}

And data loooks like this :

{
  "firstName": "John",
  "lastName": "Doe",
  "age": 21,
  "extraField": "some new data I was not expecting",
  "anotherExtraField": "another unexpected data point"
}

In this case, instead of an exception from json-schema because of additionalProperties: false, I want a list in return, like : [extraField, anotherExtraField]


Solution

  • If you're using an implementation that supports 2019-09 or 2020-12 with annotations, you're in luck! additionalProperties should produce an annotation result of the properties it validates (spec).

    If you add additionalProperties: true, then all extra properties pass and are validated by the keyword, which means those extra properties should be listed in the annotation result.

    {
      "type": "object",
      "properties": {
        "firstName": {
          "type": "string"
        },
        "lastName": {
          "type": "string"
        },
        "age": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    }
    

    This yields (in the Detailed output format)

    {
      "valid": true,
      "keywordLocation": "#",
      "instanceLocation": "#",
      "annotations": [
        {
          "valid": true,
          "keywordLocation": "#/properties",
          "instanceLocation": "#",
          "annotation": [
            "firstName",
            "lastName",
            "age"
          ]
        },
        {
          "valid": true,
          "keywordLocation": "#/additionalProperties",
          "instanceLocation": "#",
          "annotation": [
            "extraField",
            "anotherExtraField"
          ]
        }
      ]
    }
    

    You can try it on https://json-everything.net, which is powered by my validator, JsonSchema.Net.

    If you're not using .Net, you can browse the implementations page for other libraries. Some of them may also support annotations, but I'm not sure which do.