github.com/gogf/gf@v1.16.9/encoding/gjson/gjson_z_unit_basic_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/gogf/gf.
     6  
     7  package gjson_test
     8  
     9  import (
    10  	"github.com/gogf/gf/container/gmap"
    11  	"testing"
    12  
    13  	"github.com/gogf/gf/encoding/gjson"
    14  	"github.com/gogf/gf/frame/g"
    15  	"github.com/gogf/gf/test/gtest"
    16  )
    17  
    18  func Test_New(t *testing.T) {
    19  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    20  	gtest.C(t, func(t *gtest.T) {
    21  		j := gjson.New(data)
    22  		t.Assert(j.Get("n"), "123456789")
    23  		t.Assert(j.Get("m"), g.Map{"k": "v"})
    24  		t.Assert(j.Get("a"), g.Slice{1, 2, 3})
    25  	})
    26  
    27  	gtest.C(t, func(t *gtest.T) {
    28  		m := gmap.NewAnyAnyMapFrom(g.MapAnyAny{
    29  			"k1": "v1",
    30  			"k2": "v2",
    31  		})
    32  		j := gjson.New(m)
    33  		t.Assert(j.Get("k1"), "v1")
    34  		t.Assert(j.Get("k2"), "v2")
    35  		t.Assert(j.Get("k3"), nil)
    36  	})
    37  }
    38  
    39  func Test_Valid(t *testing.T) {
    40  	data1 := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    41  	data2 := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]`)
    42  	gtest.C(t, func(t *gtest.T) {
    43  		t.Assert(gjson.Valid(data1), true)
    44  		t.Assert(gjson.Valid(data2), false)
    45  	})
    46  }
    47  
    48  func Test_Encode(t *testing.T) {
    49  	value := g.Slice{1, 2, 3}
    50  	gtest.C(t, func(t *gtest.T) {
    51  		b, err := gjson.Encode(value)
    52  		t.Assert(err, nil)
    53  		t.Assert(b, []byte(`[1,2,3]`))
    54  	})
    55  }
    56  
    57  func Test_Decode(t *testing.T) {
    58  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    59  	gtest.C(t, func(t *gtest.T) {
    60  		v, err := gjson.Decode(data)
    61  		t.Assert(err, nil)
    62  		t.Assert(v, g.Map{
    63  			"n": 123456789,
    64  			"a": g.Slice{1, 2, 3},
    65  			"m": g.Map{
    66  				"k": "v",
    67  			},
    68  		})
    69  	})
    70  	gtest.C(t, func(t *gtest.T) {
    71  		var v interface{}
    72  		err := gjson.DecodeTo(data, &v)
    73  		t.Assert(err, nil)
    74  		t.Assert(v, g.Map{
    75  			"n": 123456789,
    76  			"a": g.Slice{1, 2, 3},
    77  			"m": g.Map{
    78  				"k": "v",
    79  			},
    80  		})
    81  	})
    82  	gtest.C(t, func(t *gtest.T) {
    83  		j, err := gjson.DecodeToJson(data)
    84  		t.Assert(err, nil)
    85  		t.Assert(j.Get("n"), "123456789")
    86  		t.Assert(j.Get("m"), g.Map{"k": "v"})
    87  		t.Assert(j.Get("m.k"), "v")
    88  		t.Assert(j.Get("a"), g.Slice{1, 2, 3})
    89  		t.Assert(j.Get("a.1"), 2)
    90  	})
    91  }
    92  
    93  func Test_SplitChar(t *testing.T) {
    94  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
    95  	gtest.C(t, func(t *gtest.T) {
    96  		j, err := gjson.DecodeToJson(data)
    97  		j.SetSplitChar(byte('#'))
    98  		t.Assert(err, nil)
    99  		t.Assert(j.Get("n"), "123456789")
   100  		t.Assert(j.Get("m"), g.Map{"k": "v"})
   101  		t.Assert(j.Get("m#k"), "v")
   102  		t.Assert(j.Get("a"), g.Slice{1, 2, 3})
   103  		t.Assert(j.Get("a#1"), 2)
   104  	})
   105  }
   106  
   107  func Test_ViolenceCheck(t *testing.T) {
   108  	data := []byte(`{"m":{"a":[1,2,3], "v1.v2":"4"}}`)
   109  	gtest.C(t, func(t *gtest.T) {
   110  		j, err := gjson.DecodeToJson(data)
   111  		t.Assert(err, nil)
   112  		t.Assert(j.Get("m.a.2"), 3)
   113  		t.Assert(j.Get("m.v1.v2"), nil)
   114  		j.SetViolenceCheck(true)
   115  		t.Assert(j.Get("m.v1.v2"), 4)
   116  	})
   117  }
   118  
   119  func Test_GetVar(t *testing.T) {
   120  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   121  	gtest.C(t, func(t *gtest.T) {
   122  		j, err := gjson.DecodeToJson(data)
   123  		t.Assert(err, nil)
   124  		t.Assert(j.GetVar("n").String(), "123456789")
   125  		t.Assert(j.GetVar("m").Map(), g.Map{"k": "v"})
   126  		t.Assert(j.GetVar("a").Interfaces(), g.Slice{1, 2, 3})
   127  		t.Assert(j.GetVar("a").Slice(), g.Slice{1, 2, 3})
   128  		t.Assert(j.GetVar("a").Array(), g.Slice{1, 2, 3})
   129  	})
   130  }
   131  
   132  func Test_GetMap(t *testing.T) {
   133  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   134  	gtest.C(t, func(t *gtest.T) {
   135  		j, err := gjson.DecodeToJson(data)
   136  		t.Assert(err, nil)
   137  		t.Assert(j.GetMap("n"), nil)
   138  		t.Assert(j.GetMap("m"), g.Map{"k": "v"})
   139  		t.Assert(j.GetMap("a"), g.Map{"1": "2", "3": nil})
   140  	})
   141  }
   142  
   143  func Test_GetJson(t *testing.T) {
   144  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   145  	gtest.C(t, func(t *gtest.T) {
   146  		j, err := gjson.DecodeToJson(data)
   147  		t.Assert(err, nil)
   148  		j2 := j.GetJson("m")
   149  		t.AssertNE(j2, nil)
   150  		t.Assert(j2.Get("k"), "v")
   151  		t.Assert(j2.Get("a"), nil)
   152  		t.Assert(j2.Get("n"), nil)
   153  	})
   154  }
   155  
   156  func Test_GetArray(t *testing.T) {
   157  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   158  	gtest.C(t, func(t *gtest.T) {
   159  		j, err := gjson.DecodeToJson(data)
   160  		t.Assert(err, nil)
   161  		t.Assert(j.GetArray("n"), g.Array{123456789})
   162  		t.Assert(j.GetArray("m"), g.Array{g.Map{"k": "v"}})
   163  		t.Assert(j.GetArray("a"), g.Array{1, 2, 3})
   164  	})
   165  }
   166  
   167  func Test_GetString(t *testing.T) {
   168  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   169  	gtest.C(t, func(t *gtest.T) {
   170  		j, err := gjson.DecodeToJson(data)
   171  		t.Assert(err, nil)
   172  		t.AssertEQ(j.GetString("n"), "123456789")
   173  		t.AssertEQ(j.GetString("m"), `{"k":"v"}`)
   174  		t.AssertEQ(j.GetString("a"), `[1,2,3]`)
   175  		t.AssertEQ(j.GetString("i"), "")
   176  	})
   177  }
   178  
   179  func Test_GetStrings(t *testing.T) {
   180  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   181  	gtest.C(t, func(t *gtest.T) {
   182  		j, err := gjson.DecodeToJson(data)
   183  		t.Assert(err, nil)
   184  		t.AssertEQ(j.GetStrings("n"), g.SliceStr{"123456789"})
   185  		t.AssertEQ(j.GetStrings("m"), g.SliceStr{`{"k":"v"}`})
   186  		t.AssertEQ(j.GetStrings("a"), g.SliceStr{"1", "2", "3"})
   187  		t.AssertEQ(j.GetStrings("i"), nil)
   188  	})
   189  }
   190  
   191  func Test_GetInterfaces(t *testing.T) {
   192  	data := []byte(`{"n":123456789, "m":{"k":"v"}, "a":[1,2,3]}`)
   193  	gtest.C(t, func(t *gtest.T) {
   194  		j, err := gjson.DecodeToJson(data)
   195  		t.Assert(err, nil)
   196  		t.AssertEQ(j.GetInterfaces("n"), g.Array{123456789})
   197  		t.AssertEQ(j.GetInterfaces("m"), g.Array{g.Map{"k": "v"}})
   198  		t.AssertEQ(j.GetInterfaces("a"), g.Array{1, 2, 3})
   199  	})
   200  }
   201  
   202  func Test_Len(t *testing.T) {
   203  	gtest.C(t, func(t *gtest.T) {
   204  		p := gjson.New(nil)
   205  		p.Append("a", 1)
   206  		p.Append("a", 2)
   207  		t.Assert(p.Len("a"), 2)
   208  	})
   209  	gtest.C(t, func(t *gtest.T) {
   210  		p := gjson.New(nil)
   211  		p.Append("a.b", 1)
   212  		p.Append("a.c", 2)
   213  		t.Assert(p.Len("a"), 2)
   214  	})
   215  	gtest.C(t, func(t *gtest.T) {
   216  		p := gjson.New(nil)
   217  		p.Set("a", 1)
   218  		t.Assert(p.Len("a"), -1)
   219  	})
   220  }
   221  
   222  func Test_Append(t *testing.T) {
   223  	gtest.C(t, func(t *gtest.T) {
   224  		p := gjson.New(nil)
   225  		p.Append("a", 1)
   226  		p.Append("a", 2)
   227  		t.Assert(p.Get("a"), g.Slice{1, 2})
   228  	})
   229  	gtest.C(t, func(t *gtest.T) {
   230  		p := gjson.New(nil)
   231  		p.Append("a.b", 1)
   232  		p.Append("a.c", 2)
   233  		t.Assert(p.Get("a"), g.Map{
   234  			"b": g.Slice{1},
   235  			"c": g.Slice{2},
   236  		})
   237  	})
   238  	gtest.C(t, func(t *gtest.T) {
   239  		p := gjson.New(nil)
   240  		p.Set("a", 1)
   241  		err := p.Append("a", 2)
   242  		t.AssertNE(err, nil)
   243  		t.Assert(p.Get("a"), 1)
   244  	})
   245  }
   246  
   247  func TestJson_ToJson(t *testing.T) {
   248  	gtest.C(t, func(t *gtest.T) {
   249  		p := gjson.New(1)
   250  		s, e := p.ToJsonString()
   251  		t.Assert(e, nil)
   252  		t.Assert(s, "1")
   253  	})
   254  	gtest.C(t, func(t *gtest.T) {
   255  		p := gjson.New("a")
   256  		s, e := p.ToJsonString()
   257  		t.Assert(e, nil)
   258  		t.Assert(s, `"a"`)
   259  	})
   260  }
   261  
   262  func TestJson_Default(t *testing.T) {
   263  	gtest.C(t, func(t *gtest.T) {
   264  		j := gjson.New(nil)
   265  		t.AssertEQ(j.Get("no", 100), 100)
   266  		t.AssertEQ(j.GetString("no", 100), "100")
   267  		t.AssertEQ(j.GetBool("no", "on"), true)
   268  		t.AssertEQ(j.GetInt("no", 100), 100)
   269  		t.AssertEQ(j.GetInt8("no", 100), int8(100))
   270  		t.AssertEQ(j.GetInt16("no", 100), int16(100))
   271  		t.AssertEQ(j.GetInt32("no", 100), int32(100))
   272  		t.AssertEQ(j.GetInt64("no", 100), int64(100))
   273  		t.AssertEQ(j.GetUint("no", 100), uint(100))
   274  		t.AssertEQ(j.GetUint8("no", 100), uint8(100))
   275  		t.AssertEQ(j.GetUint16("no", 100), uint16(100))
   276  		t.AssertEQ(j.GetUint32("no", 100), uint32(100))
   277  		t.AssertEQ(j.GetUint64("no", 100), uint64(100))
   278  		t.AssertEQ(j.GetFloat32("no", 123.456), float32(123.456))
   279  		t.AssertEQ(j.GetFloat64("no", 123.456), float64(123.456))
   280  		t.AssertEQ(j.GetArray("no", g.Slice{1, 2, 3}), g.Slice{1, 2, 3})
   281  		t.AssertEQ(j.GetInts("no", g.Slice{1, 2, 3}), g.SliceInt{1, 2, 3})
   282  		t.AssertEQ(j.GetFloats("no", g.Slice{1, 2, 3}), []float64{1, 2, 3})
   283  		t.AssertEQ(j.GetMap("no", g.Map{"k": "v"}), g.Map{"k": "v"})
   284  		t.AssertEQ(j.GetVar("no", 123.456).Float64(), float64(123.456))
   285  		t.AssertEQ(j.GetJson("no", g.Map{"k": "v"}).Get("k"), "v")
   286  		t.AssertEQ(j.GetJsons("no", g.Slice{
   287  			g.Map{"k1": "v1"},
   288  			g.Map{"k2": "v2"},
   289  			g.Map{"k3": "v3"},
   290  		})[0].Get("k1"), "v1")
   291  		t.AssertEQ(j.GetJsonMap("no", g.Map{
   292  			"m1": g.Map{"k1": "v1"},
   293  			"m2": g.Map{"k2": "v2"},
   294  		})["m2"].Get("k2"), "v2")
   295  	})
   296  }
   297  
   298  func Test_Convert(t *testing.T) {
   299  	gtest.C(t, func(t *gtest.T) {
   300  		j := gjson.New(`{"name":"gf"}`)
   301  		arr, err := j.ToXml()
   302  		t.Assert(err, nil)
   303  		t.Assert(string(arr), "<name>gf</name>")
   304  		arr, err = j.ToXmlIndent()
   305  		t.Assert(err, nil)
   306  		t.Assert(string(arr), "<name>gf</name>")
   307  		str, err := j.ToXmlString()
   308  		t.Assert(err, nil)
   309  		t.Assert(str, "<name>gf</name>")
   310  		str, err = j.ToXmlIndentString()
   311  		t.Assert(err, nil)
   312  		t.Assert(str, "<name>gf</name>")
   313  
   314  		arr, err = j.ToJsonIndent()
   315  		t.Assert(err, nil)
   316  		t.Assert(string(arr), "{\n\t\"name\": \"gf\"\n}")
   317  		str, err = j.ToJsonIndentString()
   318  		t.Assert(err, nil)
   319  		t.Assert(string(arr), "{\n\t\"name\": \"gf\"\n}")
   320  
   321  		arr, err = j.ToYaml()
   322  		t.Assert(err, nil)
   323  		t.Assert(string(arr), "name: gf\n")
   324  		str, err = j.ToYamlString()
   325  		t.Assert(err, nil)
   326  		t.Assert(string(arr), "name: gf\n")
   327  
   328  		arr, err = j.ToToml()
   329  		t.Assert(err, nil)
   330  		t.Assert(string(arr), "name = \"gf\"\n")
   331  		str, err = j.ToTomlString()
   332  		t.Assert(err, nil)
   333  		t.Assert(string(arr), "name = \"gf\"\n")
   334  	})
   335  }
   336  
   337  func Test_Convert2(t *testing.T) {
   338  	gtest.C(t, func(t *gtest.T) {
   339  		name := struct {
   340  			Name string
   341  		}{}
   342  		j := gjson.New(`{"name":"gf","time":"2019-06-12"}`)
   343  		t.Assert(j.Value().(g.Map)["name"], "gf")
   344  		t.Assert(j.GetMap("name1"), nil)
   345  		t.AssertNE(j.GetJson("name1"), nil)
   346  		t.Assert(j.GetJsons("name1"), nil)
   347  		t.Assert(j.GetJsonMap("name1"), nil)
   348  		t.Assert(j.Contains("name1"), false)
   349  		t.Assert(j.GetVar("name1").IsNil(), true)
   350  		t.Assert(j.GetVar("name").IsNil(), false)
   351  		t.Assert(j.Len("name1"), -1)
   352  		t.Assert(j.GetTime("time").Format("2006-01-02"), "2019-06-12")
   353  		t.Assert(j.GetGTime("time").Format("Y-m-d"), "2019-06-12")
   354  		t.Assert(j.GetDuration("time").String(), "0s")
   355  
   356  		err := j.Struct(&name)
   357  		t.Assert(err, nil)
   358  		t.Assert(name.Name, "gf")
   359  		//j.Dump()
   360  		t.Assert(err, nil)
   361  
   362  		j = gjson.New(`{"person":{"name":"gf"}}`)
   363  		err = j.GetStruct("person", &name)
   364  		t.Assert(err, nil)
   365  		t.Assert(name.Name, "gf")
   366  
   367  		j = gjson.New(`{"name":"gf""}`)
   368  		//j.Dump()
   369  		t.Assert(err, nil)
   370  
   371  		j = gjson.New(`[1,2,3]`)
   372  		t.Assert(len(j.Array()), 3)
   373  	})
   374  }
   375  
   376  func Test_Basic(t *testing.T) {
   377  	gtest.C(t, func(t *gtest.T) {
   378  		j := gjson.New(`{"name":"gf","time":"2019-06-12"}`)
   379  		j.SetViolenceCheck(true)
   380  		t.Assert(j.Get(""), nil)
   381  		t.Assert(j.Get(".").(g.Map)["name"], "gf")
   382  		t.Assert(j.Get(".").(g.Map)["name1"], nil)
   383  		j.SetViolenceCheck(false)
   384  		t.Assert(j.Get(".").(g.Map)["name"], "gf")
   385  
   386  		err := j.Set("name", "gf1")
   387  		t.Assert(err, nil)
   388  		t.Assert(j.Get("name"), "gf1")
   389  
   390  		j = gjson.New(`[1,2,3]`)
   391  		err = j.Set("\"0\".1", 11)
   392  		t.Assert(err, nil)
   393  		t.Assert(j.Get("1"), 11)
   394  
   395  		j = gjson.New(`[1,2,3]`)
   396  		err = j.Set("11111111111111111111111", 11)
   397  		t.AssertNE(err, nil)
   398  
   399  		j = gjson.New(`[1,2,3]`)
   400  		err = j.Remove("1")
   401  		t.Assert(err, nil)
   402  		t.Assert(j.Get("0"), 1)
   403  		t.Assert(len(j.Array()), 2)
   404  
   405  		j = gjson.New(`[1,2,3]`)
   406  		// If index 0 is delete, its next item will be at index 0.
   407  		t.Assert(j.Remove("0"), nil)
   408  		t.Assert(j.Remove("0"), nil)
   409  		t.Assert(j.Remove("0"), nil)
   410  		t.Assert(j.Get("0"), nil)
   411  		t.Assert(len(j.Array()), 0)
   412  
   413  		j = gjson.New(`[1,2,3]`)
   414  		err = j.Remove("3")
   415  		t.Assert(err, nil)
   416  		t.Assert(j.Get("0"), 1)
   417  		t.Assert(len(j.Array()), 3)
   418  
   419  		j = gjson.New(`[1,2,3]`)
   420  		err = j.Remove("0.3")
   421  		t.Assert(err, nil)
   422  		t.Assert(j.Get("0"), 1)
   423  
   424  		j = gjson.New(`[1,2,3]`)
   425  		err = j.Remove("0.a")
   426  		t.Assert(err, nil)
   427  		t.Assert(j.Get("0"), 1)
   428  
   429  		name := struct {
   430  			Name string
   431  		}{Name: "gf"}
   432  		j = gjson.New(name)
   433  		t.Assert(j.Get("Name"), "gf")
   434  		err = j.Remove("Name")
   435  		t.Assert(err, nil)
   436  		t.Assert(j.Get("Name"), nil)
   437  
   438  		err = j.Set("Name", "gf1")
   439  		t.Assert(err, nil)
   440  		t.Assert(j.Get("Name"), "gf1")
   441  
   442  		j = gjson.New(nil)
   443  		err = j.Remove("Name")
   444  		t.Assert(err, nil)
   445  		t.Assert(j.Get("Name"), nil)
   446  
   447  		j = gjson.New(name)
   448  		t.Assert(j.Get("Name"), "gf")
   449  		err = j.Set("Name1", g.Map{"Name": "gf1"})
   450  		t.Assert(err, nil)
   451  		t.Assert(j.Get("Name1").(g.Map)["Name"], "gf1")
   452  		err = j.Set("Name2", g.Slice{1, 2, 3})
   453  		t.Assert(err, nil)
   454  		t.Assert(j.Get("Name2").(g.Slice)[0], 1)
   455  		err = j.Set("Name3", name)
   456  		t.Assert(err, nil)
   457  		t.Assert(j.Get("Name3").(g.Map)["Name"], "gf")
   458  		err = j.Set("Name4", &name)
   459  		t.Assert(err, nil)
   460  		t.Assert(j.Get("Name4").(g.Map)["Name"], "gf")
   461  		arr := [3]int{1, 2, 3}
   462  		err = j.Set("Name5", arr)
   463  		t.Assert(err, nil)
   464  		t.Assert(j.Get("Name5").(g.Array)[0], 1)
   465  
   466  	})
   467  }
   468  
   469  func TestJson_Var(t *testing.T) {
   470  	gtest.C(t, func(t *gtest.T) {
   471  		data := []byte("[9223372036854775807, 9223372036854775806]")
   472  		array := gjson.New(data).Var().Array()
   473  		t.Assert(array, []uint64{9223372036854776000, 9223372036854776000})
   474  	})
   475  	gtest.C(t, func(t *gtest.T) {
   476  		data := []byte("[9223372036854775807, 9223372036854775806]")
   477  		array := gjson.NewWithOptions(data, gjson.Options{StrNumber: true}).Var().Array()
   478  		t.Assert(array, []uint64{9223372036854775807, 9223372036854775806})
   479  	})
   480  }
   481  
   482  func TestJson_IsNil(t *testing.T) {
   483  	gtest.C(t, func(t *gtest.T) {
   484  		j := gjson.New(nil)
   485  		t.Assert(j.IsNil(), true)
   486  	})
   487  }
   488  
   489  func TestJson_Set_With_Struct(t *testing.T) {
   490  	gtest.C(t, func(t *gtest.T) {
   491  		v := gjson.New(g.Map{
   492  			"user1": g.Map{"name": "user1"},
   493  			"user2": g.Map{"name": "user2"},
   494  			"user3": g.Map{"name": "user3"},
   495  		})
   496  		user1 := v.GetJson("user1")
   497  		user1.Set("id", 111)
   498  		v.Set("user1", user1)
   499  		t.Assert(v.Get("user1.id"), 111)
   500  	})
   501  }