Documentation ¶
Overview ¶
Package jsonry exists to make is easier to marshal and unmarshal nested JSON into Go structures. For example:
{ "relationships": { "space": { "data": { "guid": "267758c0-985b-11ea-b9ac-48bf6bec2d78" } } } }
Can be marshaled and unmarshaled using the Go struct:
type s struct { GUID string `jsonry:"relationships.space.data.guid"` }
There is no need to create intermediate structures as would be required with the standard Go JSON parser.
JSONry uses the standard Go parser under the covers. JSONry is a trade-off that delivers usability in exchange for performance.
JSONry uses struct tags to specify locations in the JSON document.
When there is neither a "jsonry" or "json" struct tag, the JSON object key name will be the same as the struct field name. For example:
Go: s := struct { Foo string }{Foo: "value"} JSON: {"Foo": "value"}
When there is a "json" struct tag, it will be interpreted in the same way as the standard Go JSON parser would interpret it. For example:
Go: s := struct { Foo string `json:"bar"` }{Foo: "value"} JSON: {"bar": "value"}
When there is a "jsonry" struct tag, in addition to working like the "json" tag, it may also contain "." (period) to denote a nesting hierarchy. For example:
Go: s := struct { Foo string `jsonry:"foo.bar"` }{Foo: "value"} JSON: {"foo": {"bar": "value"} }
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Marshal ¶
Marshal converts the specified Go struct into JSON. The input must be a struct or a pointer to a struct. Where a field is optional, the suffix ",omitempty" can be specified. This will mean that the field will be omitted from the JSON output if it is a nil pointer or has zero value for the type. When a field is a slice or an array, a single list hint "[]" may be specified in the JSONry path so that the array is created at the correct position in the JSON output.
If a type implements the json.Marshaler interface, then the MarshalJSON() method will be called.
If a type implements the jsonry.Omissible interface, then the OmitJSONry() method will be used to to determine whether or not to marshal the field, overriding any `,omitempty` tags.
The field type can be string, bool, int*, uint*, float*, map, slice, array or struct. JSONry is recursive.
Example ¶
package main import ( "fmt" "code.cloudfoundry.org/jsonry" ) func main() { s := struct { A string B string `json:"bee,omitempty"` GUID string `jsonry:"relationships.space.data.guid"` IDs []int `jsonry:"data.entries[].id"` }{ A: "foo", B: "", GUID: "267758c0-985b-11ea-b9ac-48bf6bec2d78", IDs: []int{1, 2, 3, 4, 5}, } json, err := jsonry.Marshal(s) if err != nil { panic(err) } fmt.Println(string(json)) }
Output: {"A":"foo","data":{"entries":[{"id":1},{"id":2},{"id":3},{"id":4},{"id":5}]},"relationships":{"space":{"data":{"guid":"267758c0-985b-11ea-b9ac-48bf6bec2d78"}}}}
Example (Recursive) ¶
package main import ( "fmt" "code.cloudfoundry.org/jsonry" ) func main() { type s struct { A string `jsonry:"f"` } type t struct { B []s `jsonry:"d[].e"` } type u struct { C []t `jsonry:"a.b[].c"` } data := u{C: []t{{B: []s{{A: "foo"}, {"bar"}}}, {B: []s{{A: "baz"}, {"quz"}}}}} json, err := jsonry.Marshal(data) if err != nil { panic(err) } fmt.Println(string(json)) }
Output: {"a":{"b":[{"c":{"d":[{"e":{"f":"foo"}},{"e":{"f":"bar"}}]}},{"c":{"d":[{"e":{"f":"baz"}},{"e":{"f":"quz"}}]}}]}}
func Unmarshal ¶
Unmarshal parses the specified JSON into the specified Go struct receiver. The receiver must be a pointer to a Go struct containing only fields of the type: string, bool, int*, uint*, float*, map, slice or struct. JSONry is recursive.
If a field implements the json.Unmarshaler interface, then the UnmarshalJSON() method will be called.
Example ¶
package main import ( "fmt" "code.cloudfoundry.org/jsonry" ) func main() { json := ` { "A": "foo", "bee": "bar", "data": { "entries": [ {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5} ] }, "relationships": { "space": { "data": { "guid":"267758c0-985b-11ea-b9ac-48bf6bec2d78"} } } } }` var s struct { A string B string `json:"bee"` GUID string `jsonry:"relationships.space.data.guid"` IDs []int `jsonry:"data.entries.id"` } if err := jsonry.Unmarshal([]byte(json), &s); err != nil { panic(err) } fmt.Printf("A: %+v\nB: %+v\nGUID: %+v\nIDs: %+v\n", s.A, s.B, s.GUID, s.IDs) }
Output: A: foo B: bar GUID: 267758c0-985b-11ea-b9ac-48bf6bec2d78 IDs: [1 2 3 4 5]
Types ¶
type Omissible ¶ added in v1.1.0
type Omissible interface {
OmitJSONry() bool
}
Omissible is the interface implemented by types that indicate whether they should be omitted when being marshaled. It allows for more custom control than the `omitempty` tag. This interface overrides any `omitempty` behavior, and it is not necessary to specify `omitempty` with an Omissible type.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
internal
|
|
errorcontext
Package errorcontext represents a marshalling or unmarshalling call stack for use in error messages
|
Package errorcontext represents a marshalling or unmarshalling call stack for use in error messages |
path
Package path represents a notation for accessing elements in JSON
|
Package path represents a notation for accessing elements in JSON |
tree
Package tree is a Go representation of a JSON object
|
Package tree is a Go representation of a JSON object |