Home > Enterprise >  UUIDs as object keys in JSON Schema
UUIDs as object keys in JSON Schema

Time:02-18

I am trying to define a JSON Schema for a JSON API that uses UUIDs as their key for a JSON object. What makes it more complex is that it is also a nested object. Example:

{
   "nodes": {
       "7059e5ad-fac0-4fda-aa3e-2655d6e60506": {
           "type": "Class",
           "name": "Supermarket",
           "data": {},
           "instances": {},
       }
   }
}

Which has a generated schema like this:

 {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "nodes": {
            "type": "object",
            "properties": {
                "7059e5ad-fac0-4fda-aa3e-2655d6e60506": {
                    "type": "object",
                    "properties": {
                        "type": {
                            "type": "string"
                        },
                        "name": {
                            "type": "string"
                        },
                        "data": {
                            "type": "object"
                        },
                        "instances": {
                            "type": "object"
                        }
                    }
                }
            }
        }
    }
}

Is there a way I can make a schema where there are no UUIDs values in the schema because these values can be anything?

CodePudding user response:

Replace properties with patternProperties, and your UUID with the following regular expression.

^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$

The patternProperties keyword is like the properties keyword, but you can use a regular expression for the key. This works in draft-04 JSON Schema, but it's highly recommended to use a newer version of JSON Schema if you can.

This regex was borrowed, but I'm reasonably confident it is for a UUID.

CodePudding user response:

You can leverage the existing uuid format definition, in draft2019-09 and later:

"propertyNames": {
  "format": "uuid"
},
"additionalProperties": {
  .. definition of the values that go under the uuid properties ..
}
  • Related