| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package misc_tests
- import (
- "encoding/json"
- "reflect"
- "testing"
- "github.com/json-iterator/go"
- )
- type Level1 struct {
- Hello []Level2
- }
- type Level2 struct {
- World string
- }
- func Test_nested(t *testing.T) {
- iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{"hello": [{"world": "value1"}, {"world": "value2"}]}`)
- l1 := Level1{}
- for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
- switch l1Field {
- case "hello":
- l2Array := []Level2{}
- for iter.ReadArray() {
- l2 := Level2{}
- for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
- switch l2Field {
- case "world":
- l2.World = iter.ReadString()
- default:
- iter.ReportError("bind l2", "unexpected field: "+l2Field)
- }
- }
- l2Array = append(l2Array, l2)
- }
- l1.Hello = l2Array
- default:
- iter.ReportError("bind l1", "unexpected field: "+l1Field)
- }
- }
- if !reflect.DeepEqual(l1, Level1{
- Hello: []Level2{
- {World: "value1"},
- {World: "value2"},
- },
- }) {
- t.Fatal(l1)
- }
- }
- func Benchmark_jsoniter_nested(b *testing.B) {
- for n := 0; n < b.N; n++ {
- iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{"hello": [{"world": "value1"}, {"world": "value2"}]}`)
- l1 := Level1{}
- for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
- switch l1Field {
- case "hello":
- l1.Hello = readLevel1Hello(iter)
- default:
- iter.Skip()
- }
- }
- }
- }
- func readLevel1Hello(iter *jsoniter.Iterator) []Level2 {
- l2Array := make([]Level2, 0, 2)
- for iter.ReadArray() {
- l2 := Level2{}
- for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
- switch l2Field {
- case "world":
- l2.World = iter.ReadString()
- default:
- iter.Skip()
- }
- }
- l2Array = append(l2Array, l2)
- }
- return l2Array
- }
- func Benchmark_json_nested(b *testing.B) {
- for n := 0; n < b.N; n++ {
- l1 := Level1{}
- json.Unmarshal([]byte(`{"hello": [{"world": "value1"}, {"world": "value2"}]}`), &l1)
- }
- }
|