Documentation ¶
Overview ¶
Package jsonschema uses reflection to generate JSON Schemas from Go types [1].
If json tags are present on struct fields, they will be used to infer property names and if a property is required (omitempty is present).
[1] http://json-schema.org/latest/json-schema-validation.html
Index ¶
- Constants
- Variables
- func Addslashes(str string) string
- func BaseName(fullname string) (baseName string)
- func ExtractGoComments(base, path string, commentMap map[string]string) error
- func GetMetaLine(tagLineKVpairs []kvstruct.KVS) (tagLineKVpair *kvstruct.KVS, ok bool)
- func IsMetaLine(lineTags kvstruct.KVS) bool
- func JsonMerge(first string, second string, more ...string) (merge string, err error)
- func JsonSchema2LineSchema(jsonschemaStr string) (lineschemaStr string, err error)
- func Namespace(fullname string) (namespace string)
- func OneRawLineSchema(schema *Schema, required []string) (oneRaw string, err error)
- func ParseJsonschemalineRaw(jsonschemalineRaw string) (meta *Meta, item *JsonschemalineItem, err error)
- func PretreatJsonschemalineRaw(tag string) (formatTag string)
- func SnakeCase(name string) string
- func SplitLineSchema(onelineSchema string) kvstruct.KVS
- func SplitMultilineSchema(lineSchema string) []kvstruct.KVS
- func SplitOnUnescapedCommas(tagString string) []string
- func ToCamel(name string) string
- func ToLowerCamel(name string) string
- type DefaultJson
- type Definitions
- type ID
- type Instruct
- type InstructTpl
- type InstructTpls
- type Instructs
- type Jsonschemaline
- func (l *Jsonschemaline) GjsonPath(...) (gjsonPath string)
- func (l *Jsonschemaline) JsonExample() (jsonExample string, err error)
- func (l *Jsonschemaline) JsonSchema() (jsonschemaByte []byte, err error)
- func (l *Jsonschemaline) Jsonschemaline2json() (jsonStr string, err error)
- func (l *Jsonschemaline) String() string
- func (l *Jsonschemaline) ToSturct() (structs Structs)
- type JsonschemalineItem
- type Meta
- type Reflector
- type Schema
- func (t *Schema) GetByFullname(fullname string) *Schema
- func (t *Schema) GetByName(name string) *Schema
- func (t *Schema) Lineschema() (lineSchema string, err error)
- func (t *Schema) MarshalJSON() ([]byte, error)
- func (t *Schema) Raw2Schema(lineSchema Jsonschemaline)
- func (t *Schema) UnmarshalJSON(data []byte) error
- type Struct
- type StructAttr
- type Structs
Examples ¶
Constants ¶
const ( LINE_SCHEMA_DIRECTION_OUT = "out" // 出参 LINE_SCHEMA_DIRECTION_IN = "in" // 入参 LINE_SCHEMA_DIRECTION_CONVERT = "convert" // 内部转换 )
const EOF = "\n"
const EOF_DOUBLE = "\n\n" //double
Variables ¶
var ( // TrueSchema defines a schema with a true value TrueSchema = &Schema{boolean: &[]bool{true}[0]} // FalseSchema defines a schema with a false value FalseSchema = &Schema{boolean: &[]bool{false}[0]} )
var Version = "http://json-schema.org/draft/2020-12/schema"
Version is the JSON Schema version.
Functions ¶
func Addslashes ¶ added in v0.0.12
func ExtractGoComments ¶
ExtractGoComments will read all the go files contained in the provided path, including sub-directories, in order to generate a dictionary of comments associated with Types and Fields. The results will be added to the `commentsMap` provided in the parameters and expected to be used for Schema "description" fields.
The `go/parser` library is used to extract all the comments and unfortunately doesn't have a built-in way to determine the fully qualified name of a package. The `base` paremeter, the URL used to import that package, is thus required to be able to match reflected types.
When parsing type comments, we use the `go/doc`'s Synopsis method to extract the first phrase only. Field comments, which tend to be much shorter, will include everything.
func GetMetaLine ¶
func IsMetaLine ¶
func JsonSchema2LineSchema ¶
func OneRawLineSchema ¶
func ParseJsonschemalineRaw ¶
func ParseJsonschemalineRaw(jsonschemalineRaw string) (meta *Meta, item *JsonschemalineItem, err error)
ParseJsonschemalineRaw 解析 jsonschemaline 一行数据
func PretreatJsonschemalineRaw ¶
PretreatJsonschemalineRaw 处理enum []格式
func SplitLineSchema ¶
func SplitMultilineSchema ¶
func SplitOnUnescapedCommas ¶
Split on commas that are not preceded by `\`. This way, we prevent splitting regexes
func ToLowerCamel ¶
Types ¶
type DefaultJson ¶
func ParseDefaultJson ¶
func ParseDefaultJson(jsonschemaline Jsonschemaline) (defaultJson *DefaultJson, err error)
type Definitions ¶
Definitions hold schema definitions. http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.26 RFC draft-wright-json-schema-validation-00, section 5.26
type ID ¶
type ID string
ID represents a Schema ID type which should always be a URI. See draft-bhutton-json-schema-00 section 8.2.1
const EmptyID ID = ""
EmptyID is used to explicitly define an ID with no value.
func (ID) Add ¶
Add appends the provided path to the id, and removes any anchor data that might be there.
type Instruct ¶
type Instruct struct { ID string // 唯一标识 Cmd string Src string Dst string Tpl string ExtraEndTpl []string // 一个元素代表一个模板命令,方便去重 ExtraStartTpl []string // 一个元素代表一个模板命令,方便去重 }
func FormatOutputInstruct ¶ added in v0.0.5
type InstructTpl ¶
func FormatOutputTplInstruct ¶ added in v0.0.5
func FormatOutputTplInstruct(instructTpl InstructTpl) (newInstructTpl InstructTpl)
func ParseInstructTp ¶
func ParseInstructTp(lineschema Jsonschemaline) (instructTpl *InstructTpl)
func (*InstructTpl) String ¶
func (instructTpl *InstructTpl) String() string
type InstructTpls ¶
type InstructTpls []*InstructTpl
func (InstructTpls) GetByID ¶
func (instructTpls InstructTpls) GetByID(id string) *InstructTpl
type Jsonschemaline ¶
type Jsonschemaline struct { Meta *Meta Items []*JsonschemalineItem }
func Json2lineSchema ¶
func Json2lineSchema(jsonStr string) (out *Jsonschemaline, err error)
Json2gsonPatch
func ParseJsonschemaline ¶
func ParseJsonschemaline(jsonschemalineBlock string) (jsonschemaline *Jsonschemaline, err error)
ParseJsonschemaline 解析单个 jsonschemaline
func ParseMultiJsonSchemaline ¶
func ParseMultiJsonSchemaline(jsonschemalineBlocks string) (jsonschemalines []*Jsonschemaline, err error)
ParseMultiJsonSchemaline 解析多个 jsonschemaline
func (*Jsonschemaline) GjsonPath ¶ added in v0.0.8
func (l *Jsonschemaline) GjsonPath(formatPath func(format string, src string, item *JsonschemalineItem) (path string)) (gjsonPath string)
func (*Jsonschemaline) JsonExample ¶ added in v0.0.19
func (l *Jsonschemaline) JsonExample() (jsonExample string, err error)
func (*Jsonschemaline) JsonSchema ¶ added in v0.0.2
func (l *Jsonschemaline) JsonSchema() (jsonschemaByte []byte, err error)
func (*Jsonschemaline) Jsonschemaline2json ¶
func (l *Jsonschemaline) Jsonschemaline2json() (jsonStr string, err error)
Deprecated see JsonExample
func (*Jsonschemaline) String ¶
func (l *Jsonschemaline) String() string
func (*Jsonschemaline) ToSturct ¶ added in v0.0.21
func (l *Jsonschemaline) ToSturct() (structs Structs)
type JsonschemalineItem ¶
type JsonschemalineItem struct { Comments string `json:"comment,omitempty"` // section 8.3 Type string `json:"type,omitempty"` // section 6.1.1 Enum []string `json:"enum,omitempty"` // section 6.1.2 EnumNames []string `json:"enumNames,omitempty"` // section 6.1.2 Const string `json:"const,omitempty"` // section 6.1.3 MultipleOf int `json:"multipleOf,omitempty,string"` // section 6.2.1 Maximum int `json:"maximum,omitempty,string"` // section 6.2.2 ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty,string"` // section 6.2.3 Minimum int `json:"minimum,omitempty,string"` // section 6.2.4 ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty,string"` // section 6.2.5 MaxLength int `json:"maxLength,omitempty,string"` // section 6.3.1 MinLength int `json:"minLength,omitempty,string"` // section 6.3.2 Pattern string `json:"pattern,omitempty"` // section 6.3.3 MaxItems int `json:"maxItems,omitempty,string"` // section 6.4.1 MinItems int `json:"minItems,omitempty,string"` // section 6.4.2 UniqueItems bool `json:"uniqueItems,omitempty,string"` // section 6.4.3 MaxContains uint `json:"maxContains,omitempty,string"` // section 6.4.4 MinContains uint `json:"minContains,omitempty,string"` // section 6.4.5 MaxProperties int `json:"maxProperties,omitempty,string"` // section 6.5.1 MinProperties int `json:"minProperties,omitempty,string"` // section 6.5.2 Required bool `json:"required,omitempty,string"` // section 6.5.3 // RFC draft-bhutton-json-schema-validation-00, section 7 Format string `json:"format,omitempty"` // RFC draft-bhutton-json-schema-validation-00, section 8 ContentEncoding string `json:"contentEncoding,omitempty"` // section 8.3 ContentMediaType string `json:"contentMediaType,omitempty"` // section 8.4 Title string `json:"title,omitempty"` // section 9.1 Description string `json:"description,omitempty"` // section 9.1 Default string `json:"default,omitempty"` // section 9.2 Deprecated bool `json:"deprecated,omitempty,string"` // section 9.3 ReadOnly bool `json:"readOnly,omitempty,string"` // section 9.4 WriteOnly bool `json:"writeOnly,omitempty,string"` // section 9.4 Example string `json:"example,omitempty"` // section 9.5 Examples string `json:"examples,omitempty"` // section 9.5 Src string `json:"src,omitempty"` Dst string `json:"dst,omitempty"` Fullname string `json:"fullname,omitempty"` TagLineKVpair kvstruct.KVS `json:"-"` }
func (JsonschemalineItem) Json ¶ added in v0.0.15
func (jItem JsonschemalineItem) Json() (jsonStr string)
func (JsonschemalineItem) ToJsonSchemaKVS ¶ added in v0.0.16
func (jItem JsonschemalineItem) ToJsonSchemaKVS() (kvs kvstruct.KVS, err error)
type Meta ¶
type Reflector ¶
type Reflector struct { // BaseSchemaID defines the URI that will be used as a base to determine Schema // IDs for models. For example, a base Schema ID of `https://invopop.com/schemas` // when defined with a struct called `User{}`, will result in a schema with an // ID set to `https://invopop.com/schemas/user`. // // If no `BaseSchemaID` is provided, we'll take the type's complete package path // and use that as a base instead. Set `Anonymous` to try if you do not want to // include a schema ID. BaseSchemaID ID // Anonymous when true will hide the auto-generated Schema ID and provide what is // known as an "anonymous schema". As a rule, this is not recommended. Anonymous bool // AssignAnchor when true will use the original struct's name as an anchor inside // every definition, including the root schema. These can be useful for having a // reference to the original struct's name in CamelCase instead of the snake-case used // by default for URI compatibility. // // Anchors do not appear to be widely used out in the wild, so at this time the // anchors themselves will not be used inside generated schema. AssignAnchor bool // AllowAdditionalProperties will cause the Reflector to generate a schema // without additionalProperties set to 'false' for all struct types. This means // the presence of additional keys in JSON objects will not cause validation // to fail. Note said additional keys will simply be dropped when the // validated JSON is unmarshaled. AllowAdditionalProperties bool // RequiredFromJSONSchemaTags will cause the Reflector to generate a schema // that requires any key tagged with `jsonschema:required`, overriding the // default of requiring any key *not* tagged with `json:,omitempty`. RequiredFromJSONSchemaTags bool // YAMLEmbeddedStructs will cause the Reflector to generate a schema that does // not inline embedded structs. This should be enabled if the JSON schemas are // used with yaml.Marshal/Unmarshal. YAMLEmbeddedStructs bool // Prefer yaml: tags over json: tags to generate the schema even if json: tags // are present PreferYAMLSchema bool // Do not reference definitions. This will remove the top-level $defs map and // instead cause the entire structure of types to be output in one tree. The // list of type definitions (`$defs`) will not be included. DoNotReference bool // ExpandedStruct when true will include the reflected type's definition in the // root as opposed to a definition with a reference. Using a reference in the root // is useful as it allows us to maintain the struct's original name, but it is // not common practice. ExpandedStruct bool // IgnoredTypes defines a slice of types that should be ignored in the schema, // switching to just allowing additional properties instead. IgnoredTypes []interface{} // Lookup allows a function to be defined that will provide a custom mapping of // types to Schema IDs. This allows existing schema documents to be referenced // by their ID instead of being embedded into the current schema definitions. // Reflected types will never be pointers, only underlying elements. Lookup func(reflect.Type) ID // Mapper is a function that can be used to map custom Go types to jsonschema schemas. Mapper func(reflect.Type) *Schema // Namer allows customizing of type names. The default is to use the type's name // provided by the reflect package. Namer func(reflect.Type) string // KeyNamer allows customizing of key names. // The default is to use the key's name as is, or the json (or yaml) tag if present. // If a json or yaml tag is present, KeyNamer will receive the tag's name as an argument, not the original key name. KeyNamer func(string) string // AdditionalFields allows adding structfields for a given type AdditionalFields func(reflect.Type) []reflect.StructField // CommentMap is a dictionary of fully qualified go types and fields to comment // strings that will be used if a description has not already been provided in // the tags. Types and fields are added to the package path using "." as a // separator. // // Type descriptions should be defined like: // // map[string]string{"github.com/invopop/jsonschema.Reflector": "A Reflector reflects values into a Schema."} // // And Fields defined as: // // map[string]string{"github.com/invopop/jsonschema.Reflector.DoNotReference": "Do not reference definitions."} // // See also: AddGoComments CommentMap map[string]string }
A Reflector reflects values into a Schema.
func (*Reflector) AddGoComments ¶
AddGoComments will update the reflectors comment map with all the comments found in the provided source directories. See the #ExtractGoComments method for more details.
func (*Reflector) ReflectFromType ¶
ReflectFromType generates root schema
func (*Reflector) SetBaseSchemaID ¶
SetBaseSchemaID is a helper use to be able to set the reflectors base schema ID from a string as opposed to then ID instance.
type Schema ¶
type Schema struct { // RFC draft-bhutton-json-schema-00 Version string `json:"$schema,omitempty"` // section 8.1.1 ID ID `json:"$id,omitempty"` // section 8.2.1 Anchor string `json:"$anchor,omitempty"` // section 8.2.2 Ref string `json:"$ref,omitempty"` // section 8.2.3.1 DynamicRef string `json:"$dynamicRef,omitempty"` // section 8.2.3.2 Definitions Definitions `json:"$defs,omitempty"` // section 8.2.4 Comments string `json:"$comment,omitempty"` // section 8.3 // RFC draft-bhutton-json-schema-00 section 10.2.1 (Sub-schemas with logic) AllOf []*Schema `json:"allOf,omitempty"` // section 10.2.1.1 AnyOf []*Schema `json:"anyOf,omitempty"` // section 10.2.1.2 OneOf []*Schema `json:"oneOf,omitempty"` // section 10.2.1.3 Not *Schema `json:"not,omitempty"` // section 10.2.1.4 // RFC draft-bhutton-json-schema-00 section 10.2.2 (Apply sub-schemas conditionally) If *Schema `json:"if,omitempty"` // section 10.2.2.1 Then *Schema `json:"then,omitempty"` // section 10.2.2.2 Else *Schema `json:"else,omitempty"` // section 10.2.2.3 DependentSchemas map[string]*Schema `json:"dependentSchemas,omitempty"` // section 10.2.2.4 // RFC draft-bhutton-json-schema-00 section 10.3.1 (arrays) PrefixItems []*Schema `json:"prefixItems,omitempty"` // section 10.3.1.1 Items *Schema `json:"items,omitempty"` // section 10.3.1.2 (replaces additionalItems) Contains *Schema `json:"contains,omitempty"` // section 10.3.1.3 // RFC draft-bhutton-json-schema-00 section 10.3.2 (sub-schemas) Properties *orderedmap.OrderedMap `json:"properties,omitempty"` // section 10.3.2.1 PatternProperties map[string]*Schema `json:"patternProperties,omitempty"` // section 10.3.2.2 AdditionalProperties *Schema `json:"additionalProperties,omitempty"` // section 10.3.2.3 PropertyNames *Schema `json:"propertyNames,omitempty"` // section 10.3.2.4 // RFC draft-bhutton-json-schema-validation-00, section 6 Type string `json:"type,omitempty"` // section 6.1.1 Enum []interface{} `json:"enum,omitempty"` // section 6.1.2 Const interface{} `json:"const,omitempty"` // section 6.1.3 MultipleOf int `json:"multipleOf,omitempty"` // section 6.2.1 Maximum int `json:"maximum,omitempty"` // section 6.2.2 ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` // section 6.2.3 Minimum int `json:"minimum,omitempty"` // section 6.2.4 ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` // section 6.2.5 MaxLength int `json:"maxLength,omitempty"` // section 6.3.1 MinLength int `json:"minLength,omitempty"` // section 6.3.2 Pattern string `json:"pattern,omitempty"` // section 6.3.3 MaxItems int `json:"maxItems,omitempty"` // section 6.4.1 MinItems int `json:"minItems,omitempty"` // section 6.4.2 UniqueItems bool `json:"uniqueItems,omitempty"` // section 6.4.3 MaxContains uint `json:"maxContains,omitempty"` // section 6.4.4 MinContains uint `json:"minContains,omitempty"` // section 6.4.5 MaxProperties int `json:"maxProperties,omitempty"` // section 6.5.1 MinProperties int `json:"minProperties,omitempty"` // section 6.5.2 Required []string `json:"required,omitempty"` // section 6.5.3 DependentRequired map[string][]string `json:"dependentRequired,omitempty"` // section 6.5.4 // RFC draft-bhutton-json-schema-validation-00, section 7 Format string `json:"format,omitempty"` // RFC draft-bhutton-json-schema-validation-00, section 8 ContentEncoding string `json:"contentEncoding,omitempty"` // section 8.3 ContentMediaType string `json:"contentMediaType,omitempty"` // section 8.4 ContentSchema *Schema `json:"contentSchema,omitempty"` // section 8.5 // RFC draft-bhutton-json-schema-validation-00, section 9 Title string `json:"title,omitempty"` // section 9.1 Description string `json:"description,omitempty"` // section 9.1 Default interface{} `json:"default,omitempty"` // section 9.2 Deprecated bool `json:"deprecated,omitempty"` // section 9.3 ReadOnly bool `json:"readOnly,omitempty"` // section 9.4 WriteOnly bool `json:"writeOnly,omitempty"` // section 9.4 Examples []interface{} `json:"examples,omitempty"` // section 9.5 Extras map[string]interface{} `json:"-"` Src string `json:"src,omitempty"` Dst string `json:"dst,omitempty"` Fullname string `json:"fullname,omitempty"` Tpl string `json:"tpl,omitempty"` PropertyName string `json:"-"` Parent *Schema `json:"-"` // contains filtered or unexported fields }
Schema represents a JSON Schema object type. RFC draft-bhutton-json-schema-00 section 4.3
func Reflect ¶
func Reflect(v interface{}) *Schema
Reflect reflects to Schema from a value using the default Reflector
Example ¶
package main import ( "encoding/json" "fmt" "time" jsonschema "github.com/suifengpiao14/jsonschemaline" ) type SampleUser 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" jsonschema_extras:"a=b,foo=bar,foo=bar1"` BirthDate time.Time `json:"birth_date,omitempty" jsonschema:"oneof_required=date"` YearOfBirth string `json:"year_of_birth,omitempty" jsonschema:"oneof_required=year"` Metadata interface{} `json:"metadata,omitempty" jsonschema:"oneof_type=string;array"` FavColor string `json:"fav_color,omitempty" jsonschema:"enum=red,enum=green,enum=blue"` } func main() { s := jsonschema.Reflect(&SampleUser{}) data, _ := json.MarshalIndent(s, "", " ") fmt.Println(string(data)) }
Output: { "$schema": "http://json-schema.org/draft/2020-12/schema", "$id": "https://github.com/invopop/jsonschema_test/sample-user", "$ref": "#/$defs/SampleUser", "$defs": { "SampleUser": { "oneOf": [ { "required": [ "birth_date" ], "title": "date" }, { "required": [ "year_of_birth" ], "title": "year" } ], "properties": { "id": { "type": "integer" }, "name": { "type": "string", "title": "the name", "description": "The name of a friend", "default": "alex", "examples": [ "joe", "lucy" ] }, "friends": { "items": { "type": "integer" }, "type": "array", "description": "The list of IDs, omitted when empty" }, "tags": { "type": "object", "a": "b", "foo": [ "bar", "bar1" ] }, "birth_date": { "type": "string", "format": "date-time" }, "year_of_birth": { "type": "string" }, "metadata": { "oneOf": [ { "type": "string" }, { "type": "array" } ] }, "fav_color": { "type": "string", "enum": [ "red", "green", "blue" ] } }, "additionalProperties": false, "type": "object", "required": [ "id", "name" ] } } }
func ReflectFromType ¶
ReflectFromType generates root schema using the default Reflector
func (*Schema) GetByFullname ¶
func (*Schema) Lineschema ¶
func (*Schema) MarshalJSON ¶
func (*Schema) Raw2Schema ¶
func (t *Schema) Raw2Schema(lineSchema Jsonschemaline)
func (*Schema) UnmarshalJSON ¶
UnmarshalJSON is used to parse a schema object or boolean.
type Struct ¶ added in v0.0.21
type Struct struct { IsRoot bool Name string Lineschema string Attrs []*StructAttr }
func (*Struct) AddAttrIgnore ¶ added in v0.0.21
func (s *Struct) AddAttrIgnore(attrs ...StructAttr)
AddAttrIgnore 已经存在则跳过
func (*Struct) AddAttrReplace ¶ added in v0.0.21
func (s *Struct) AddAttrReplace(attrs ...StructAttr)
AddAttrReplace 增加或者替换