GitHub - alecthomas/jsonschema: Generate JSON Schemas from Go types
source link: https://github.com/alecthomas/jsonschema
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
Go JSON Schema Reflection
This package can be used to generate JSON Schemas 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:
type TestUser struct { ID int `json:"id"` Name string `json:"name" jsonschema="title=the name,description=The name of a friend,example=joe,example=lucy,default=alex"` Friends []int `json:"friends,omitempty" jsonschema_description:"The list of IDs, omitted when empty"` Tags map[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" }, "description": "The list of IDs, omitted when empty" }, "id": { "type": "integer" }, "name": { "type": "string", "title": "the name", "description": "The name of a friend", "default": "alex", "examples": [ "joe", "lucy" ] }, "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.
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:
{ "$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" } } }
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK