JSON Schema with unknown property names

JsonJsonschema

Json Problem Overview


I want to have a JSON Schema with unknown property names in an array of objects. A good example is the meta-data of a web page:

      "meta": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "unknown-attribute-1": {
              "type": "string"
            },
            "unknown-attribute-2": {
              "type": "string"
            },
            ...
          }
        }
      }

Any ideas please, or other way to reach the same?

Json Solutions


Solution 1 - Json

Use patternProperties instead of properties. In the example below, the pattern match regex .* accepts any property name and I am allowing types of string or null only by using "additionalProperties": false.

  "patternProperties": {
    "^.*$": {
      "anyOf": [
  	    {"type": "string"},
  	    {"type": "null"}
      ]
    }
  },
  "additionalProperties": false

... or if you just want to allow a string in your "object" (like in the original question):

  "patternProperties": {
	"^.*$": {
		{"type": "string"},
	}
  },
  "additionalProperties": false

Solution 2 - Json

You can make constraints on properties not explicitly defined. The following schema enforces "meta" to be an array of objects whose properties are of type string:

{
	"properties" : {
		"meta" : {
			"type" : "array",
			"items" : {
                "type" : "object",
				"additionalProperties" : {
					"type" : "string"
				}
			}
		}
	}
}

In case you just want to have an array of strings, you may use the following schema:

{
	"properties" : {
		"meta" : {
			"type" : "array",
			"items" : {
				"type" : "string"
			}
		}
	}
}

Solution 3 - Json

The Solution of @jruizaranguren works for me. Though I am the same who defines the schema, i choosed another solution

"meta": {
        "type": "array",
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            }
          }
        }
      }

I converted the object to an array of name-value objects An example of a valid JSON:

"meta": [
    [
      {
        "name": "http-equiv",
        "value": "Content-Type"
      },
      {
        "name": "content",
        "value": "text/html; charset=UTF-8"
      }
    ],
    [      {        "name": "name",        "value": "author"      },      {        "name": "content",        "value": "Astrid Florence Cassing"      }    ]
  ]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThami BouchnafaView Question on Stackoverflow
Solution 1 - Jsonpink spikyhairmanView Answer on Stackoverflow
Solution 2 - JsonjruizarangurenView Answer on Stackoverflow
Solution 3 - JsonThami BouchnafaView Answer on Stackoverflow