github.com/wangyougui/gf/v2@v2.6.5/encoding/gjson/gjson_z_unit_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package gjson_test
     8  
     9  import (
    10  	"fmt"
    11  	"testing"
    12  
    13  	"github.com/wangyougui/gf/v2/container/gmap"
    14  	"github.com/wangyougui/gf/v2/container/gvar"
    15  	"github.com/wangyougui/gf/v2/encoding/gjson"
    16  	"github.com/wangyougui/gf/v2/frame/g"
    17  	"github.com/wangyougui/gf/v2/os/gtime"
    18  	"github.com/wangyougui/gf/v2/test/gtest"
    19  	"github.com/wangyougui/gf/v2/util/gconv"
    20  )
    21  
    22  func Test_New(t *testing.T) {
    23  	// New with json map.
    24  	gtest.C(t, func(t *gtest.T) {
    25  		data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    26  		j := gjson.New(data)
    27  		t.Assert(j.Get("n").String(), "123456789")
    28  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
    29  		t.Assert(j.Get("a").Array(), g.Slice{1, 2, 3})
    30  	})
    31  	// New with json array map.
    32  	gtest.C(t, func(t *gtest.T) {
    33  		j := gjson.New(`[{"a":1},{"b":2},{"c":3}]`)
    34  		t.Assert(j.Get(".").String(), `[{"a":1},{"b":2},{"c":3}]`)
    35  		t.Assert(j.Get("2.c").String(), `3`)
    36  	})
    37  	// New with gvar.
    38  	// https://github.com/wangyougui/gf/issues/1571
    39  	gtest.C(t, func(t *gtest.T) {
    40  		v := gvar.New(`[{"a":1},{"b":2},{"c":3}]`)
    41  		j := gjson.New(v)
    42  		t.Assert(j.Get(".").String(), `[{"a":1},{"b":2},{"c":3}]`)
    43  		t.Assert(j.Get("2.c").String(), `3`)
    44  	})
    45  	// New with gmap.
    46  	gtest.C(t, func(t *gtest.T) {
    47  		m := gmap.NewAnyAnyMapFrom(g.MapAnyAny{
    48  			"k1": "v1",
    49  			"k2": "v2",
    50  		})
    51  		j := gjson.New(m)
    52  		t.Assert(j.Get("k1"), "v1")
    53  		t.Assert(j.Get("k2"), "v2")
    54  		t.Assert(j.Get("k3"), nil)
    55  	})
    56  	// https://github.com/wangyougui/gf/issues/3253
    57  	gtest.C(t, func(t *gtest.T) {
    58  		type TestStruct struct {
    59  			Result []map[string]string `json:"result"`
    60  		}
    61  		ts := &TestStruct{
    62  			Result: []map[string]string{
    63  				{
    64  					"Name": "gf",
    65  					"Role": "",
    66  				},
    67  			},
    68  		}
    69  		gjson.New(ts)
    70  	})
    71  }
    72  
    73  func Test_Valid(t *testing.T) {
    74  	data1 := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    75  	data2 := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]`)
    76  	gtest.C(t, func(t *gtest.T) {
    77  		t.Assert(gjson.Valid(data1), true)
    78  		t.Assert(gjson.Valid(data2), false)
    79  	})
    80  }
    81  
    82  func Test_Encode(t *testing.T) {
    83  	value := g.Slice{1, 2, 3}
    84  	gtest.C(t, func(t *gtest.T) {
    85  		b, err := gjson.Encode(value)
    86  		t.AssertNil(err)
    87  		t.Assert(b, []byte(`[1,2,3]`))
    88  	})
    89  }
    90  
    91  func Test_Decode(t *testing.T) {
    92  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    93  	gtest.C(t, func(t *gtest.T) {
    94  		v, err := gjson.Decode(data)
    95  		t.AssertNil(err)
    96  		t.Assert(v, g.Map{
    97  			"n": 123456789,
    98  			"a": g.Slice{1, 2, 3},
    99  			"m": g.Map{
   100  				"k": "v",
   101  			},
   102  		})
   103  	})
   104  	gtest.C(t, func(t *gtest.T) {
   105  		var v interface{}
   106  		err := gjson.DecodeTo(data, &v)
   107  		t.AssertNil(err)
   108  		t.Assert(v, g.Map{
   109  			"n": 123456789,
   110  			"a": g.Slice{1, 2, 3},
   111  			"m": g.Map{
   112  				"k": "v",
   113  			},
   114  		})
   115  	})
   116  	gtest.C(t, func(t *gtest.T) {
   117  		j, err := gjson.DecodeToJson(data)
   118  		t.AssertNil(err)
   119  		t.Assert(j.Get("n").String(), "123456789")
   120  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   121  		t.Assert(j.Get("m.k"), "v")
   122  		t.Assert(j.Get("a").Array(), g.Slice{1, 2, 3})
   123  		t.Assert(j.Get("a.1").Int(), 2)
   124  	})
   125  }
   126  
   127  func Test_SplitChar(t *testing.T) {
   128  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   129  	gtest.C(t, func(t *gtest.T) {
   130  		j, err := gjson.DecodeToJson(data)
   131  		j.SetSplitChar(byte('#'))
   132  		t.AssertNil(err)
   133  		t.Assert(j.Get("n").String(), "123456789")
   134  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   135  		t.Assert(j.Get("m#k").String(), "v")
   136  		t.Assert(j.Get("a").Array(), g.Slice{1, 2, 3})
   137  		t.Assert(j.Get("a#1").Int(), 2)
   138  	})
   139  }
   140  
   141  func Test_ViolenceCheck(t *testing.T) {
   142  	data := []byte(`{"m":{"a":[1,2,3], "v1.v2":"4"}}`)
   143  	gtest.C(t, func(t *gtest.T) {
   144  		j, err := gjson.DecodeToJson(data)
   145  		t.AssertNil(err)
   146  		t.Assert(j.Get("m.a.2"), 3)
   147  		t.Assert(j.Get("m.v1.v2"), nil)
   148  		j.SetViolenceCheck(true)
   149  		t.Assert(j.Get("m.v1.v2"), 4)
   150  	})
   151  }
   152  
   153  func Test_GetVar(t *testing.T) {
   154  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   155  	gtest.C(t, func(t *gtest.T) {
   156  		j, err := gjson.DecodeToJson(data)
   157  		t.AssertNil(err)
   158  		t.Assert(j.Get("n").String(), "123456789")
   159  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   160  		t.Assert(j.Get("a").Interfaces(), g.Slice{1, 2, 3})
   161  		t.Assert(j.Get("a").Slice(), g.Slice{1, 2, 3})
   162  		t.Assert(j.Get("a").Array(), g.Slice{1, 2, 3})
   163  	})
   164  }
   165  
   166  func Test_GetMap(t *testing.T) {
   167  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   168  	gtest.C(t, func(t *gtest.T) {
   169  		j, err := gjson.DecodeToJson(data)
   170  		t.AssertNil(err)
   171  		t.Assert(j.Get("n").Map(), nil)
   172  		t.Assert(j.Get("m").Map(), g.Map{"k": "v"})
   173  		t.Assert(j.Get("a").Map(), g.Map{"1": "2", "3": nil})
   174  	})
   175  }
   176  
   177  func Test_GetJson(t *testing.T) {
   178  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   179  	gtest.C(t, func(t *gtest.T) {
   180  		j, err := gjson.DecodeToJson(data)
   181  		t.AssertNil(err)
   182  		j2 := j.GetJson("m")
   183  		t.AssertNE(j2, nil)
   184  		t.Assert(j2.Get("k"), "v")
   185  		t.Assert(j2.Get("a"), nil)
   186  		t.Assert(j2.Get("n"), nil)
   187  	})
   188  }
   189  
   190  func Test_GetArray(t *testing.T) {
   191  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   192  	gtest.C(t, func(t *gtest.T) {
   193  		j, err := gjson.DecodeToJson(data)
   194  		t.AssertNil(err)
   195  		t.Assert(j.Get("n").Array(), g.Array{123456789})
   196  		t.Assert(j.Get("m").Array(), g.Array{g.Map{"k": "v"}})
   197  		t.Assert(j.Get("a").Array(), g.Array{1, 2, 3})
   198  	})
   199  }
   200  
   201  func Test_GetString(t *testing.T) {
   202  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   203  	gtest.C(t, func(t *gtest.T) {
   204  		j, err := gjson.DecodeToJson(data)
   205  		t.AssertNil(err)
   206  		t.AssertEQ(j.Get("n").String(), "123456789")
   207  		t.AssertEQ(j.Get("m").String(), `{"k":"v"}`)
   208  		t.AssertEQ(j.Get("a").String(), `[1,2,3]`)
   209  		t.AssertEQ(j.Get("i").String(), "")
   210  	})
   211  }
   212  
   213  func Test_GetStrings(t *testing.T) {
   214  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   215  	gtest.C(t, func(t *gtest.T) {
   216  		j, err := gjson.DecodeToJson(data)
   217  		t.AssertNil(err)
   218  		t.AssertEQ(j.Get("n").Strings(), g.SliceStr{"123456789"})
   219  		t.AssertEQ(j.Get("m").Strings(), g.SliceStr{`{"k":"v"}`})
   220  		t.AssertEQ(j.Get("a").Strings(), g.SliceStr{"1", "2", "3"})
   221  		t.AssertEQ(j.Get("i").Strings(), nil)
   222  	})
   223  }
   224  
   225  func Test_GetInterfaces(t *testing.T) {
   226  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   227  	gtest.C(t, func(t *gtest.T) {
   228  		j, err := gjson.DecodeToJson(data)
   229  		t.AssertNil(err)
   230  		t.AssertEQ(j.Get("n").Interfaces(), g.Array{123456789})
   231  		t.AssertEQ(j.Get("m").Interfaces(), g.Array{g.Map{"k": "v"}})
   232  		t.AssertEQ(j.Get("a").Interfaces(), g.Array{1, 2, 3})
   233  	})
   234  }
   235  
   236  func Test_Len(t *testing.T) {
   237  	gtest.C(t, func(t *gtest.T) {
   238  		p := gjson.New(nil)
   239  		p.Append("a", 1)
   240  		p.Append("a", 2)
   241  		t.Assert(p.Len("a"), 2)
   242  	})
   243  	gtest.C(t, func(t *gtest.T) {
   244  		p := gjson.New(nil)
   245  		p.Append("a.b", 1)
   246  		p.Append("a.c", 2)
   247  		t.Assert(p.Len("a"), 2)
   248  	})
   249  	gtest.C(t, func(t *gtest.T) {
   250  		p := gjson.New(nil)
   251  		p.Set("a", 1)
   252  		t.Assert(p.Len("a"), -1)
   253  	})
   254  }
   255  
   256  func Test_Append(t *testing.T) {
   257  	gtest.C(t, func(t *gtest.T) {
   258  		p := gjson.New(nil)
   259  		p.Append("a", 1)
   260  		p.Append("a", 2)
   261  		t.Assert(p.Get("a"), g.Slice{1, 2})
   262  	})
   263  	gtest.C(t, func(t *gtest.T) {
   264  		p := gjson.New(nil)
   265  		p.Append("a.b", 1)
   266  		p.Append("a.c", 2)
   267  		t.Assert(p.Get("a").Map(), g.Map{
   268  			"b": g.Slice{1},
   269  			"c": g.Slice{2},
   270  		})
   271  	})
   272  	gtest.C(t, func(t *gtest.T) {
   273  		p := gjson.New(nil)
   274  		p.Set("a", 1)
   275  		err := p.Append("a", 2)
   276  		t.AssertNE(err, nil)
   277  		t.Assert(p.Get("a"), 1)
   278  	})
   279  }
   280  
   281  func Test_RawArray(t *testing.T) {
   282  	gtest.C(t, func(t *gtest.T) {
   283  		j := gjson.New(nil)
   284  		t.AssertNil(j.Set("0", 1))
   285  		t.AssertNil(j.Set("1", 2))
   286  		t.Assert(j.MustToJsonString(), `[1,2]`)
   287  	})
   288  
   289  	gtest.C(t, func(t *gtest.T) {
   290  		j := gjson.New(nil)
   291  		t.AssertNil(j.Append(".", 1))
   292  		t.AssertNil(j.Append(".", 2))
   293  		t.Assert(j.MustToJsonString(), `[1,2]`)
   294  	})
   295  }
   296  
   297  func TestJson_ToJson(t *testing.T) {
   298  	gtest.C(t, func(t *gtest.T) {
   299  		p := gjson.New(1)
   300  		s, e := p.ToJsonString()
   301  		t.Assert(e, nil)
   302  		t.Assert(s, "1")
   303  	})
   304  	gtest.C(t, func(t *gtest.T) {
   305  		p := gjson.New("a")
   306  		s, e := p.ToJsonString()
   307  		t.Assert(e, nil)
   308  		t.Assert(s, `"a"`)
   309  	})
   310  }
   311  
   312  func TestJson_Default(t *testing.T) {
   313  	gtest.C(t, func(t *gtest.T) {
   314  		j := gjson.New(nil)
   315  		t.AssertEQ(j.Get("no", 100).Int(), 100)
   316  		t.AssertEQ(j.Get("no", 100).String(), "100")
   317  		t.AssertEQ(j.Get("no", "on").Bool(), true)
   318  		t.AssertEQ(j.Get("no", 100).Int(), 100)
   319  		t.AssertEQ(j.Get("no", 100).Int8(), int8(100))
   320  		t.AssertEQ(j.Get("no", 100).Int16(), int16(100))
   321  		t.AssertEQ(j.Get("no", 100).Int32(), int32(100))
   322  		t.AssertEQ(j.Get("no", 100).Int64(), int64(100))
   323  		t.AssertEQ(j.Get("no", 100).Uint(), uint(100))
   324  		t.AssertEQ(j.Get("no", 100).Uint8(), uint8(100))
   325  		t.AssertEQ(j.Get("no", 100).Uint16(), uint16(100))
   326  		t.AssertEQ(j.Get("no", 100).Uint32(), uint32(100))
   327  		t.AssertEQ(j.Get("no", 100).Uint64(), uint64(100))
   328  		t.AssertEQ(j.Get("no", 123.456).Float32(), float32(123.456))
   329  		t.AssertEQ(j.Get("no", 123.456).Float64(), float64(123.456))
   330  		t.AssertEQ(j.Get("no", g.Slice{1, 2, 3}).Array(), g.Slice{1, 2, 3})
   331  		t.AssertEQ(j.Get("no", g.Slice{1, 2, 3}).Ints(), g.SliceInt{1, 2, 3})
   332  		t.AssertEQ(j.Get("no", g.Slice{1, 2, 3}).Floats(), []float64{1, 2, 3})
   333  		t.AssertEQ(j.Get("no", g.Map{"k": "v"}).Map(), g.Map{"k": "v"})
   334  		t.AssertEQ(j.Get("no", 123.456).Float64(), float64(123.456))
   335  		t.AssertEQ(j.GetJson("no", g.Map{"k": "v"}).Get("k").String(), "v")
   336  		t.AssertEQ(j.GetJsons("no", g.Slice{
   337  			g.Map{"k1": "v1"},
   338  			g.Map{"k2": "v2"},
   339  			g.Map{"k3": "v3"},
   340  		})[0].Get("k1").String(), "v1")
   341  		t.AssertEQ(j.GetJsonMap("no", g.Map{
   342  			"m1": g.Map{"k1": "v1"},
   343  			"m2": g.Map{"k2": "v2"},
   344  		})["m2"].Get("k2").String(), "v2")
   345  	})
   346  }
   347  
   348  func Test_Convert(t *testing.T) {
   349  	gtest.C(t, func(t *gtest.T) {
   350  		j := gjson.New(`{"name":"gf"}`)
   351  		arr, err := j.ToXml()
   352  		t.AssertNil(err)
   353  		t.Assert(string(arr), "<name>gf</name>")
   354  		arr, err = j.ToXmlIndent()
   355  		t.AssertNil(err)
   356  		t.Assert(string(arr), "<name>gf</name>")
   357  		str, err := j.ToXmlString()
   358  		t.AssertNil(err)
   359  		t.Assert(str, "<name>gf</name>")
   360  		str, err = j.ToXmlIndentString()
   361  		t.AssertNil(err)
   362  		t.Assert(str, "<name>gf</name>")
   363  
   364  		arr, err = j.ToJsonIndent()
   365  		t.AssertNil(err)
   366  		t.Assert(string(arr), "{\n\t\"name\": \"gf\"\n}")
   367  		str, err = j.ToJsonIndentString()
   368  		t.AssertNil(err)
   369  		t.Assert(string(arr), "{\n\t\"name\": \"gf\"\n}")
   370  
   371  		arr, err = j.ToYaml()
   372  		t.AssertNil(err)
   373  		t.Assert(string(arr), "name: gf\n")
   374  		str, err = j.ToYamlString()
   375  		t.AssertNil(err)
   376  		t.Assert(string(arr), "name: gf\n")
   377  
   378  		arr, err = j.ToToml()
   379  		t.AssertNil(err)
   380  		t.Assert(string(arr), "name = \"gf\"\n")
   381  		str, err = j.ToTomlString()
   382  		t.AssertNil(err)
   383  		t.Assert(string(arr), "name = \"gf\"\n")
   384  	})
   385  }
   386  
   387  func Test_Convert2(t *testing.T) {
   388  	gtest.C(t, func(t *gtest.T) {
   389  		name := struct {
   390  			Name string
   391  		}{}
   392  		j := gjson.New(`{"name":"gf","time":"2019-06-12"}`)
   393  		t.Assert(j.Interface().(g.Map)["name"], "gf")
   394  		t.Assert(j.Get("name1").Map(), nil)
   395  		t.Assert(j.GetJson("name1"), nil)
   396  		t.Assert(j.GetJsons("name1"), nil)
   397  		t.Assert(j.GetJsonMap("name1"), nil)
   398  		t.Assert(j.Contains("name1"), false)
   399  		t.Assert(j.Get("name1").IsNil(), true)
   400  		t.Assert(j.Get("name").IsNil(), false)
   401  		t.Assert(j.Len("name1"), -1)
   402  		t.Assert(j.Get("time").Time().Format("2006-01-02"), "2019-06-12")
   403  		t.Assert(j.Get("time").GTime().Format("Y-m-d"), "2019-06-12")
   404  		t.Assert(j.Get("time").Duration().String(), "0s")
   405  
   406  		err := j.Var().Scan(&name)
   407  		t.AssertNil(err)
   408  		t.Assert(name.Name, "gf")
   409  		// j.Dump()
   410  		t.AssertNil(err)
   411  
   412  		j = gjson.New(`{"person":{"name":"gf"}}`)
   413  		err = j.Get("person").Scan(&name)
   414  		t.AssertNil(err)
   415  		t.Assert(name.Name, "gf")
   416  
   417  		j = gjson.New(`{"name":"gf""}`)
   418  		// j.Dump()
   419  		t.AssertNil(err)
   420  
   421  		j = gjson.New(`[1,2,3]`)
   422  		t.Assert(len(j.Var().Array()), 3)
   423  	})
   424  }
   425  
   426  func Test_Basic(t *testing.T) {
   427  	gtest.C(t, func(t *gtest.T) {
   428  		j := gjson.New(`{"name":"gf","time":"2019-06-12"}`)
   429  		j.SetViolenceCheck(true)
   430  		t.Assert(j.Get(""), nil)
   431  		t.Assert(j.Get(".").Interface().(g.Map)["name"], "gf")
   432  		t.Assert(j.Get(".").Interface().(g.Map)["name1"], nil)
   433  		j.SetViolenceCheck(false)
   434  		t.Assert(j.Get(".").Interface().(g.Map)["name"], "gf")
   435  
   436  		err := j.Set("name", "gf1")
   437  		t.AssertNil(err)
   438  		t.Assert(j.Get("name"), "gf1")
   439  
   440  		j = gjson.New(`[1,2,3]`)
   441  		err = j.Set("\"0\".1", 11)
   442  		t.AssertNil(err)
   443  		t.Assert(j.Get("1"), 11)
   444  
   445  		j = gjson.New(`[1,2,3]`)
   446  		err = j.Set("11111111111111111111111", 11)
   447  		t.AssertNE(err, nil)
   448  
   449  		j = gjson.New(`[1,2,3]`)
   450  		err = j.Remove("1")
   451  		t.AssertNil(err)
   452  		t.Assert(j.Get("0"), 1)
   453  		t.Assert(len(j.Var().Array()), 2)
   454  
   455  		j = gjson.New(`[1,2,3]`)
   456  		// If index 0 is delete, its next item will be at index 0.
   457  		t.Assert(j.Remove("0"), nil)
   458  		t.Assert(j.Remove("0"), nil)
   459  		t.Assert(j.Remove("0"), nil)
   460  		t.Assert(j.Get("0"), nil)
   461  		t.Assert(len(j.Var().Array()), 0)
   462  
   463  		j = gjson.New(`[1,2,3]`)
   464  		err = j.Remove("3")
   465  		t.AssertNil(err)
   466  		t.Assert(j.Get("0"), 1)
   467  		t.Assert(len(j.Var().Array()), 3)
   468  
   469  		j = gjson.New(`[1,2,3]`)
   470  		err = j.Remove("0.3")
   471  		t.AssertNil(err)
   472  		t.Assert(j.Get("0"), 1)
   473  
   474  		j = gjson.New(`[1,2,3]`)
   475  		err = j.Remove("0.a")
   476  		t.AssertNil(err)
   477  		t.Assert(j.Get("0"), 1)
   478  
   479  		name := struct {
   480  			Name string
   481  		}{Name: "gf"}
   482  		j = gjson.New(name)
   483  		t.Assert(j.Get("Name"), "gf")
   484  		err = j.Remove("Name")
   485  		t.AssertNil(err)
   486  		t.Assert(j.Get("Name"), nil)
   487  
   488  		err = j.Set("Name", "gf1")
   489  		t.AssertNil(err)
   490  		t.Assert(j.Get("Name"), "gf1")
   491  
   492  		j = gjson.New(nil)
   493  		err = j.Remove("Name")
   494  		t.AssertNil(err)
   495  		t.Assert(j.Get("Name"), nil)
   496  
   497  		j = gjson.New(name)
   498  		t.Assert(j.Get("Name"), "gf")
   499  		err = j.Set("Name1", g.Map{"Name": "gf1"})
   500  		t.AssertNil(err)
   501  		t.Assert(j.Get("Name1").Interface().(g.Map)["Name"], "gf1")
   502  		err = j.Set("Name2", g.Slice{1, 2, 3})
   503  		t.AssertNil(err)
   504  		t.Assert(j.Get("Name2").Interface().(g.Slice)[0], 1)
   505  		err = j.Set("Name3", name)
   506  		t.AssertNil(err)
   507  		t.Assert(j.Get("Name3").Interface().(g.Map)["Name"], "gf")
   508  		err = j.Set("Name4", &name)
   509  		t.AssertNil(err)
   510  		t.Assert(j.Get("Name4").Interface().(g.Map)["Name"], "gf")
   511  		arr := [3]int{1, 2, 3}
   512  		err = j.Set("Name5", arr)
   513  		t.AssertNil(err)
   514  		t.Assert(j.Get("Name5").Interface().(g.Array)[0], 1)
   515  
   516  	})
   517  }
   518  
   519  func TestJson_Var(t *testing.T) {
   520  	gtest.C(t, func(t *gtest.T) {
   521  		data := []byte("[9223372036854775807, 9223372036854775806]")
   522  		array := gjson.New(data).Var().Array()
   523  		t.Assert(array, []uint64{9223372036854776000, 9223372036854776000})
   524  	})
   525  	gtest.C(t, func(t *gtest.T) {
   526  		data := []byte("[9223372036854775807, 9223372036854775806]")
   527  		array := gjson.NewWithOptions(data, gjson.Options{StrNumber: true}).Var().Array()
   528  		t.Assert(array, []uint64{9223372036854775807, 9223372036854775806})
   529  	})
   530  }
   531  
   532  func TestJson_IsNil(t *testing.T) {
   533  	gtest.C(t, func(t *gtest.T) {
   534  		j := gjson.New(nil)
   535  		t.Assert(j.IsNil(), true)
   536  	})
   537  }
   538  
   539  func TestJson_Set_With_Struct(t *testing.T) {
   540  	gtest.C(t, func(t *gtest.T) {
   541  		v := gjson.New(g.Map{
   542  			"user1": g.Map{"name": "user1"},
   543  			"user2": g.Map{"name": "user2"},
   544  			"user3": g.Map{"name": "user3"},
   545  		})
   546  		user1 := v.GetJson("user1")
   547  		t.AssertNil(user1.Set("id", 111))
   548  		t.AssertNil(v.Set("user1", user1))
   549  		t.Assert(v.Get("user1.id"), 111)
   550  	})
   551  }
   552  
   553  func TestJson_Options(t *testing.T) {
   554  	gtest.C(t, func(t *gtest.T) {
   555  		type S struct {
   556  			Id int64
   557  		}
   558  		s := S{
   559  			Id: 53687091200,
   560  		}
   561  		m := make(map[string]interface{})
   562  		t.AssertNil(gjson.DecodeTo(gjson.MustEncode(s), &m, gjson.Options{
   563  			StrNumber: false,
   564  		}))
   565  		t.Assert(fmt.Sprintf(`%v`, m["Id"]), `5.36870912e+10`)
   566  		t.AssertNil(gjson.DecodeTo(gjson.MustEncode(s), &m, gjson.Options{
   567  			StrNumber: true,
   568  		}))
   569  		t.Assert(fmt.Sprintf(`%v`, m["Id"]), `53687091200`)
   570  	})
   571  }
   572  
   573  // https://github.com/wangyougui/gf/issues/1617
   574  func Test_Issue1617(t *testing.T) {
   575  	gtest.C(t, func(t *gtest.T) {
   576  		type MyJsonName struct {
   577  			F中文   int64 `json:"F中文"`
   578  			F英文   int64 `json:"F英文"`
   579  			F法文   int64 `json:"F法文"`
   580  			F西班牙语 int64 `json:"F西班牙语"`
   581  		}
   582  		jso := `{"F中文":1,"F英文":2,"F法文":3,"F西班牙语":4}`
   583  		var a MyJsonName
   584  		json, err := gjson.DecodeToJson(jso)
   585  		t.AssertNil(err)
   586  		err = json.Scan(&a)
   587  		t.AssertNil(err)
   588  		t.Assert(a, MyJsonName{
   589  			F中文:   1,
   590  			F英文:   2,
   591  			F法文:   3,
   592  			F西班牙语: 4,
   593  		})
   594  	})
   595  }
   596  
   597  // https://github.com/wangyougui/gf/issues/1747
   598  func Test_Issue1747(t *testing.T) {
   599  	gtest.C(t, func(t *gtest.T) {
   600  		var j *gjson.Json
   601  		err := gconv.Struct(gvar.New("[1, 2, 336371793314971759]"), &j)
   602  		t.AssertNil(err)
   603  		t.Assert(j.Get("2"), `336371793314971759`)
   604  	})
   605  }
   606  
   607  // https://github.com/wangyougui/gf/issues/2520
   608  func Test_Issue2520(t *testing.T) {
   609  	gtest.C(t, func(t *gtest.T) {
   610  		type test struct {
   611  			Unique *gvar.Var `json:"unique"`
   612  		}
   613  
   614  		t2 := test{Unique: gvar.New(gtime.Date())}
   615  		t.Assert(gjson.MustEncodeString(t2), gjson.New(t2).MustToJsonString())
   616  	})
   617  }