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