Transact Charlie
Transact Charlie

Reputation: 2203

json schema for a map of similar objects

I wish to write a json schema to cover this (simplified) example

{
    "errorMessage": "",
    "nbRunningQueries": 0,
    "isError": False,
    "result": {
        "foo": {"price":10.0, "country":"UK"},
        "bar": {"price":100.2, "country":"UK"}
    }
}

which can have this pretty trivial root schema

schema = {
    "type":"object",
    "required":True,
    "properties":{
        "errorMessage": {"type":"string", "required":True},
        "isError": {"type":"boolean", "required":True},
        "nbRunningQueries": {"type":"number", "required":True},
        "result": {"type":"object","required":True}
    }
}

The complication is the results {} element. Unlike a standard pattern where results would be an array of same objects - each with an id field or similar this response models a python dictionary which looks like this:

{
    "foo": {},
    "bar": {},
    ...
}

So given that a will be getting a results object of flexible size with no set keys how can I write json schema for this?

I don't control the input sadly or I'd rewrite it to be something like

{
    "errorMessage": "",
    "nbRunningQueries": 0,
    "isError": False,
    "result": [
        {"id": "foo", "price":10.0, "country": "UK"},
        {"id": "bar", "price":100.2, "country":"UK"}
    ]
}

Any help or links to pertinent examples would be great. Thanks.

Upvotes: 6

Views: 4465

Answers (1)

jruizaranguren
jruizaranguren

Reputation: 13605

With json-schema draft 4, you can use additionalProperties keyword to specify the schema of any new properties that you could receive in your results object.

"result" : {
    "type" : "object"
    "additionalProperties" : {
        "type" : "number"
    }
}

If you can restrict the allowed key names, then you may use "patternProperties" keyword and a regular expression to limit the permited key names.

Note that in json-schema draft 4 "required" must be an array which is bounded to the object, not to each property.

Upvotes: 5

Related Questions