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 }