github.com/zhongdalu/gf@v1.0.0/g/encoding/gjson/gjson_z_unit_basic_test.go (about)

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