This package can be used to generate JSON Schemas from Go types through reflection.
It supports arbitrarily complex types, including interface{}, maps, slices, etc.
The following Go type:
typeTestUserstruct {
IDint`json:"id"`Namestring`json:"name"`Friends []int`json:"friends,omitempty"`Tagsmap[string]interface{} `json:"tags,omitempty"`BirthDate time.Time`json:"birth_date,omitempty"`
}Results in following JSON Schema:
jsonschema.Reflect(&TestUser{}){
"$schema": "http://json-schema.org/draft-04/schema#",
"$ref": "#/definitions/TestUser",
"definitions": {
"TestUser": {
"type": "object",
"properties": {
"birth_date": {
"type": "string",
"format": "date-time"
},
"friends": {
"type": "array",
"items": {
"type": "integer"
}
},
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"tags": {
"type": "object",
"patternProperties": {
".*": {
"type": "object",
"additionalProperties": true
}
}
}
},
"additionalProperties": false,
"required": ["id", "name"]
}
}
}The behaviour of the schema generator can be altered with parameters when a jsonschema.Reflector
instance is created.
If set to true, makes the top level struct not to reference itself in the definitions. But type passed should be a struct type.
eg.
typeGrandfatherTypestruct {
FamilyNamestring`json:"family_name" jsonschema:"required"`
}
typeSomeBaseTypestruct {
SomeBasePropertyint`json:"some_base_property"`// The jsonschema required tag is nonsensical for private and ignored properties.// Their presence here tests that the fields *will not* be required in the output// schema, even if they are tagged required.somePrivateBasePropertystring`json:"i_am_private" jsonschema:"required"`SomeIgnoredBasePropertystring`json:"-" jsonschema:"required"`SomeUntaggedBasePropertybool`jsonschema:"required"`someUnexportedUntaggedBasePropertyboolGrandfatherGrandfatherType`json:"grand"`
}will output:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"required": [
"some_base_property",
"grand",
"SomeUntaggedBaseProperty"
],
"properties": {
"SomeUntaggedBaseProperty": {
"type": "boolean"
},
"grand": {
"$schema": "http://json-schema.org/draft-04/schema#",
"$ref": "#/definitions/GrandfatherType"
},
"some_base_property": {
"type": "integer"
}
},
"type": "object",
"definitions": {
"GrandfatherType": {
"required": [
"family_name"
],
"properties": {
"family_name": {
"type": "string"
}
},
"additionalProperties": false,
"type": "object"
}
}
}
