Skip to content

joeshaw/json-lossless

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

json-lossless

json-lossless is a Go library that populates structs from JSON and allows serialization back to JSON without losing fields that are not explicitly defined in the struct.

json-lossless builds off of bit.ly's excellent go-simplejson package.

json-lossless is experimental and probably doesn't work in a lot of cases. Pull requests very welcome.

API

Full API docs are on GoDoc: http:https://godoc.org/github.com/joeshaw/json-lossless

To get started, embed a lossless.JSON inside your struct:

type Person struct {
        lossless.JSON `json:"-"`

	Name      string `json:"name"`
	Age       int    `json:"age"`
	Address   string
	CreatedAt time.Time
}

Define MarshalJSON and UnmarshalJSON methods on the type to implement the json.Marshaler and json.Unmarshaler interfaces, deferring the work to the lossless.JSON embed:

func (p *Person) UnmarshalJSON(data []byte) error {
	return p.JSON.UnmarshalJSON(p, data)
}

func (p Person) MarshalJSON() ([]byte, error) {
	return p.JSON.MarshalJSON(p)
}

Given JSON like this:

{"name": "Jack Wolfington",
 "age": 42,
 "address": "123 Fake St.",
 "CreatedAt": "2013-09-16T10:44:40.295451647-00:00",
 "Extra": {"foo": "bar"}}

When you decode into a struct, the Extra field will be kept around, even though it's not accessible from your struct.

var p Person
if err := json.Unmarshal(data, &p); err != nil {
        panic(err)
}

data, err := json.Marshal(p)
if err != nil {
        panic(err)
}

// "Extra" is still set in the marshaled JSON:
if bytes.Index(data, "Extra") == -1 {
        panic("Extra not in data!")
}

fmt.Println(string(data))

You can also set arbitrary key/values on your struct by calling Set():

p.Set("Extra", "AgeString", "forty-two")

When serialized, Extra will look like this:

{ ...
  "Extra": {"foo": "bar", "AgeString": "forty-two"}}

Known issues

json-lossless doesn't attempt to decode arrays or simple values. For those, just use json/encoding directly.

The omitempty setting on json tag is not handled. In fact, no parsing of the tags are done at all.

The lossless.JSON value needs to be tagged with json:"-" or it will be marshaled to JSON.

About

Lossless JSON encoding/decoding package in Go

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages