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 }