summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/yaegashi/msgraph.go/jsonx/README.md
blob: 575ce78137fe81ad2a1a12ec3f9461ba429e90a9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# jsonx

It's modified version of [encoding/json](https://golang.org/pkg/encoding/json/)
which enables extra map field (with `jsonx:"true"` tag) to catch all other fields not declared in the struct.

`jsonx` is a code name for internal use
and not related to [JSONx](https://tools.ietf.org/html/draft-rsalz-jsonx-00).

Example ([Run on playgroud](https://play.golang.org/p/TZi0JeHYG69))
```go
package main

import (
	"encoding/json"
	"fmt"

	"github.com/yaegashi/msgraph.go/jsonx"
)

type Extra struct {
	X     string
	Y     int
	Extra map[string]interface{} `json:"-" jsonx:"true"`
}

func main() {
	var x1, x2 Extra
	b := []byte(`{"X":"123","Y":123,"A":"123","B":123}`)
	fmt.Printf("\nUnmarshal input: %s\n", string(b))
	json.Unmarshal(b, &x1)
	fmt.Printf(" json.Unmarshal: %#v\n", x1)
	jsonx.Unmarshal(b, &x2)
	fmt.Printf("jsonx.Unmarshal: %#v\n", x2)

	x := Extra{X: "456", Y: 456, Extra: map[string]interface{}{"A": "456", "B": 456}}
	fmt.Printf("\nMarshal input: %#v\n", x)
	b1, _ := json.Marshal(x)
	fmt.Printf(" json.Marshal: %s\n", string(b1))
	b2, _ := jsonx.Marshal(x)
	fmt.Printf("jsonx.Marshal: %s\n", string(b2))
}
```

Result

```text
Unmarshal input: {"X":"123","Y":123,"A":"123","B":123}
 json.Unmarshal: main.Extra{X:"123", Y:123, Extra:map[string]interface {}(nil)}
jsonx.Unmarshal: main.Extra{X:"123", Y:123, Extra:map[string]interface {}{"A":"123", "B":123}}

Marshal input: main.Extra{X:"456", Y:456, Extra:map[string]interface {}{"A":"456", "B":456}}
 json.Marshal: {"X":"456","Y":456}
jsonx.Marshal: {"X":"456","Y":456,"A":"456","B":456}
```