Source file
src/encoding/json/v2/example_marshaljson_test.go
1
2
3
4
5
6
7 package json_test
8
9 import (
10 "fmt"
11 "log"
12 "maps"
13 "slices"
14
15 "encoding/json/jsontext"
16 "encoding/json/v2"
17 )
18
19
20 type IntSet map[int]struct{}
21
22
23 func (s *IntSet) MarshalJSONTo(enc *jsontext.Encoder) error {
24
25 if err := enc.WriteToken(jsontext.BeginArray); err != nil {
26 return err
27 }
28
29 keys := maps.Keys(*s)
30
31
32
33 deterministic, _ := json.GetOption(enc.Options(), json.Deterministic)
34 if deterministic {
35 keys = slices.Values(slices.Sorted(keys))
36 }
37
38 for k := range keys {
39
40
41
42
43
44 if err := json.MarshalEncode(enc, k); err != nil {
45 return err
46 }
47 }
48
49 if err := enc.WriteToken(jsontext.EndArray); err != nil {
50 return err
51 }
52 return nil
53 }
54
55
56 func (s *IntSet) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
57
58 if k := dec.PeekKind(); k != '[' {
59
60
61 return &json.SemanticError{JSONKind: k}
62 }
63 if _, err := dec.ReadToken(); err != nil {
64 return err
65 }
66
67 for dec.PeekKind() != ']' {
68 var v int
69
70 if err := json.UnmarshalDecode(dec, &v); err != nil {
71 return err
72 }
73 if *s == nil {
74 *s = IntSet{}
75 }
76 (*s)[v] = struct{}{}
77 }
78
79
80 if _, err := dec.ReadToken(); err != nil {
81 return err
82 }
83 return nil
84 }
85
86
87 func ExampleMarshalerTo() {
88 set := IntSet{
89 1: {},
90 2: {},
91 3: {},
92 }
93
94 b, err := json.Marshal(&set, json.Deterministic(true))
95 if err != nil {
96 log.Fatal(err)
97 }
98
99
100 v := jsontext.Value(b)
101 v.Indent()
102 fmt.Println(string(v))
103
104
105
106
107
108
109
110 }
111
112
113 func ExampleUnmarshalerFrom() {
114 s := "[1,2,3]"
115
116 var set IntSet
117 err := json.Unmarshal([]byte(s), &set)
118 if err != nil {
119 log.Fatal(err)
120 }
121
122 fmt.Println(set)
123
124
125
126 }
127
View as plain text