Source file
src/encoding/json/v2/example_orderedobject_test.go
1
2
3
4
5
6
7 package json_test
8
9 import (
10 "fmt"
11 "log"
12 "reflect"
13
14 "encoding/json/jsontext"
15 "encoding/json/v2"
16 )
17
18
19
20
21
22
23
24
25 type OrderedObject[V any] []ObjectMember[V]
26
27
28 type ObjectMember[V any] struct {
29 Name string
30 Value V
31 }
32
33
34 func (obj *OrderedObject[V]) MarshalJSONTo(enc *jsontext.Encoder) error {
35 if err := enc.WriteToken(jsontext.BeginObject); err != nil {
36 return err
37 }
38 for i := range *obj {
39 member := &(*obj)[i]
40 if err := json.MarshalEncode(enc, &member.Name); err != nil {
41 return err
42 }
43 if err := json.MarshalEncode(enc, &member.Value); err != nil {
44 return err
45 }
46 }
47 if err := enc.WriteToken(jsontext.EndObject); err != nil {
48 return err
49 }
50 return nil
51 }
52
53
54 func (obj *OrderedObject[V]) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
55 if k := dec.PeekKind(); k != '{' {
56
57
58 return &json.SemanticError{JSONKind: k}
59 }
60 if _, err := dec.ReadToken(); err != nil {
61 return err
62 }
63 for dec.PeekKind() != '}' {
64 *obj = append(*obj, ObjectMember[V]{})
65 member := &(*obj)[len(*obj)-1]
66 if err := json.UnmarshalDecode(dec, &member.Name); err != nil {
67 return err
68 }
69 if err := json.UnmarshalDecode(dec, &member.Value); err != nil {
70 return err
71 }
72 }
73 if _, err := dec.ReadToken(); err != nil {
74 return err
75 }
76 return nil
77 }
78
79
80
81 func Example_orderedObject() {
82
83
84
85 want := OrderedObject[string]{
86 {"fizz", "buzz"},
87 {"hello", "world"},
88 {"fizz", "wuzz"},
89 }
90 b, err := json.Marshal(&want, jsontext.AllowDuplicateNames(true))
91 if err != nil {
92 log.Fatal(err)
93 }
94 var got OrderedObject[string]
95 err = json.Unmarshal(b, &got, jsontext.AllowDuplicateNames(true))
96 if err != nil {
97 log.Fatal(err)
98 }
99
100
101 if !reflect.DeepEqual(got, want) {
102 log.Fatalf("roundtrip mismatch: got %v, want %v", got, want)
103 }
104
105
106 (*jsontext.Value)(&b).Indent()
107 fmt.Println(string(b))
108
109
110
111
112
113
114
115 }
116
View as plain text