1package misc_tests
2
3import (
4	"encoding/json"
5	"github.com/json-iterator/go"
6	"reflect"
7	"testing"
8)
9
10type Level1 struct {
11	Hello []Level2
12}
13
14type Level2 struct {
15	World string
16}
17
18func Test_nested(t *testing.T) {
19	iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{"hello": [{"world": "value1"}, {"world": "value2"}]}`)
20	l1 := Level1{}
21	for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
22		switch l1Field {
23		case "hello":
24			l2Array := []Level2{}
25			for iter.ReadArray() {
26				l2 := Level2{}
27				for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
28					switch l2Field {
29					case "world":
30						l2.World = iter.ReadString()
31					default:
32						iter.ReportError("bind l2", "unexpected field: "+l2Field)
33					}
34				}
35				l2Array = append(l2Array, l2)
36			}
37			l1.Hello = l2Array
38		default:
39			iter.ReportError("bind l1", "unexpected field: "+l1Field)
40		}
41	}
42	if !reflect.DeepEqual(l1, Level1{
43		Hello: []Level2{
44			{World: "value1"},
45			{World: "value2"},
46		},
47	}) {
48		t.Fatal(l1)
49	}
50}
51
52func Benchmark_jsoniter_nested(b *testing.B) {
53	for n := 0; n < b.N; n++ {
54		iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{"hello": [{"world": "value1"}, {"world": "value2"}]}`)
55		l1 := Level1{}
56		for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
57			switch l1Field {
58			case "hello":
59				l1.Hello = readLevel1Hello(iter)
60			default:
61				iter.Skip()
62			}
63		}
64	}
65}
66
67func readLevel1Hello(iter *jsoniter.Iterator) []Level2 {
68	l2Array := make([]Level2, 0, 2)
69	for iter.ReadArray() {
70		l2 := Level2{}
71		for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
72			switch l2Field {
73			case "world":
74				l2.World = iter.ReadString()
75			default:
76				iter.Skip()
77			}
78		}
79		l2Array = append(l2Array, l2)
80	}
81	return l2Array
82}
83
84func Benchmark_json_nested(b *testing.B) {
85	for n := 0; n < b.N; n++ {
86		l1 := Level1{}
87		json.Unmarshal([]byte(`{"hello": [{"world": "value1"}, {"world": "value2"}]}`), &l1)
88	}
89}
90