| | |
| | |
| | |
| |
|
| | |
| |
|
| | package json_test |
| |
|
| | import ( |
| | "fmt" |
| | "log" |
| | "reflect" |
| |
|
| | "encoding/json/jsontext" |
| | "encoding/json/v2" |
| | ) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | type OrderedObject[V any] []ObjectMember[V] |
| |
|
| | |
| | type ObjectMember[V any] struct { |
| | Name string |
| | Value V |
| | } |
| |
|
| | |
| | func (obj *OrderedObject[V]) MarshalJSONTo(enc *jsontext.Encoder) error { |
| | if err := enc.WriteToken(jsontext.BeginObject); err != nil { |
| | return err |
| | } |
| | for i := range *obj { |
| | member := &(*obj)[i] |
| | if err := json.MarshalEncode(enc, &member.Name); err != nil { |
| | return err |
| | } |
| | if err := json.MarshalEncode(enc, &member.Value); err != nil { |
| | return err |
| | } |
| | } |
| | if err := enc.WriteToken(jsontext.EndObject); err != nil { |
| | return err |
| | } |
| | return nil |
| | } |
| |
|
| | |
| | func (obj *OrderedObject[V]) UnmarshalJSONFrom(dec *jsontext.Decoder) error { |
| | if k := dec.PeekKind(); k != '{' { |
| | |
| | |
| | return &json.SemanticError{JSONKind: k} |
| | } |
| | if _, err := dec.ReadToken(); err != nil { |
| | return err |
| | } |
| | for dec.PeekKind() != '}' { |
| | *obj = append(*obj, ObjectMember[V]{}) |
| | member := &(*obj)[len(*obj)-1] |
| | if err := json.UnmarshalDecode(dec, &member.Name); err != nil { |
| | return err |
| | } |
| | if err := json.UnmarshalDecode(dec, &member.Value); err != nil { |
| | return err |
| | } |
| | } |
| | if _, err := dec.ReadToken(); err != nil { |
| | return err |
| | } |
| | return nil |
| | } |
| |
|
| | |
| | |
| | func Example_orderedObject() { |
| | |
| | |
| | |
| | want := OrderedObject[string]{ |
| | {"fizz", "buzz"}, |
| | {"hello", "world"}, |
| | {"fizz", "wuzz"}, |
| | } |
| | b, err := json.Marshal(&want, jsontext.AllowDuplicateNames(true)) |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| | var got OrderedObject[string] |
| | err = json.Unmarshal(b, &got, jsontext.AllowDuplicateNames(true)) |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| |
|
| | |
| | if !reflect.DeepEqual(got, want) { |
| | log.Fatalf("roundtrip mismatch: got %v, want %v", got, want) |
| | } |
| |
|
| | |
| | (*jsontext.Value)(&b).Indent() |
| | fmt.Println(string(b)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | } |
| |
|