# Go JSON Schema Reflection [![Build Status](https://travis-ci.org/alecthomas/jsonschema.png)](https://travis-ci.org/alecthomas/jsonschema) [![Gitter chat](https://badges.gitter.im/alecthomas.png)](https://gitter.im/alecthomas/Lobby) [![Go Report Card](https://goreportcard.com/badge/github.com/alecthomas/jsonschema)](https://goreportcard.com/report/github.com/alecthomas/jsonschema) [![GoDoc](https://godoc.org/github.com/alecthomas/jsonschema?status.svg)](https://godoc.org/github.com/alecthomas/jsonschema) This package can be used to generate [JSON Schemas](http://json-schema.org/latest/json-schema-validation.html) from Go types through reflection. It supports arbitrarily complex types, including `interface{}`, maps, slices, etc. And it also supports json-schema features such as minLength, maxLength, pattern, format and etc. ## Example The following Go type: ```go type TestUser struct { ID int `json:"id"` Name string `json:"name"` Friends []int `json:"friends,omitempty"` Tags map[string]interface{} `json:"tags,omitempty"` BirthDate time.Time `json:"birth_date,omitempty"` } ``` Results in following JSON Schema: ```go jsonschema.Reflect(&TestUser{}) ``` ```json { "$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"] } } } ``` ## Configurable behaviour The behaviour of the schema generator can be altered with parameters when a `jsonschema.Reflector` instance is created. ### ExpandedStruct 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. ```go type GrandfatherType struct { FamilyName string `json:"family_name" jsonschema:"required"` } type SomeBaseType struct { SomeBaseProperty int `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. somePrivateBaseProperty string `json:"i_am_private" jsonschema:"required"` SomeIgnoredBaseProperty string `json:"-" jsonschema:"required"` SomeSchemaIgnoredProperty string `jsonschema:"-,required"` SomeUntaggedBaseProperty bool `jsonschema:"required"` someUnexportedUntaggedBaseProperty bool Grandfather GrandfatherType `json:"grand"` } ``` will output: ```json { "$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" } } } ```