github.com/wangyougui/gf/v2@v2.6.5/encoding/gjson/gjson_z_unit_feature_set_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 "bytes" 11 "testing" 12 13 "github.com/wangyougui/gf/v2/container/garray" 14 "github.com/wangyougui/gf/v2/encoding/gjson" 15 "github.com/wangyougui/gf/v2/frame/g" 16 "github.com/wangyougui/gf/v2/test/gtest" 17 "github.com/wangyougui/gf/v2/text/gstr" 18 ) 19 20 func Test_Set1(t *testing.T) { 21 e := []byte(`{"k1":{"k11":[1,2,3]},"k2":"v2"}`) 22 p := gjson.New(map[string]string{ 23 "k1": "v1", 24 "k2": "v2", 25 }) 26 p.Set("k1.k11", []int{1, 2, 3}) 27 if c, err := p.ToJson(); err == nil { 28 29 if !bytes.Equal(c, []byte(`{"k1":{"k11":[1,2,3]},"k2":"v2"}`)) { 30 t.Error("expect:", string(e)) 31 } 32 } else { 33 t.Error(err) 34 } 35 } 36 37 func Test_Set2(t *testing.T) { 38 gtest.C(t, func(t *gtest.T) { 39 e := `[[null,1]]` 40 p := gjson.New([]string{"a"}) 41 p.Set("0.1", 1) 42 s := p.MustToJsonString() 43 t.Assert(s, e) 44 }) 45 } 46 47 func Test_Set3(t *testing.T) { 48 e := []byte(`{"kv":{"k1":"v1"}}`) 49 p := gjson.New([]string{"a"}) 50 p.Set("kv", map[string]string{ 51 "k1": "v1", 52 }) 53 if c, err := p.ToJson(); err == nil { 54 if !bytes.Equal(c, e) { 55 t.Error("expect:", string(e)) 56 } 57 } else { 58 t.Error(err) 59 } 60 } 61 62 func Test_Set4(t *testing.T) { 63 e := []byte(`["a",[{"k1":"v1"}]]`) 64 p := gjson.New([]string{"a"}) 65 p.Set("1.0", map[string]string{ 66 "k1": "v1", 67 }) 68 if c, err := p.ToJson(); err == nil { 69 70 if !bytes.Equal(c, e) { 71 t.Error("expect:", string(e)) 72 } 73 } else { 74 t.Error(err) 75 } 76 } 77 78 func Test_Set5(t *testing.T) { 79 e := []byte(`[[[[[[[[[[[[[[[[[[[[[1,2,3]]]]]]]]]]]]]]]]]]]]]`) 80 p := gjson.New([]string{"a"}) 81 p.Set("0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0", []int{1, 2, 3}) 82 if c, err := p.ToJson(); err == nil { 83 84 if !bytes.Equal(c, e) { 85 t.Error("expect:", string(e)) 86 } 87 } else { 88 t.Error(err) 89 } 90 } 91 92 func Test_Set6(t *testing.T) { 93 e := []byte(`["a",[1,2,3]]`) 94 p := gjson.New([]string{"a"}) 95 p.Set("1", []int{1, 2, 3}) 96 if c, err := p.ToJson(); err == nil { 97 98 if !bytes.Equal(c, e) { 99 t.Error("expect:", string(e)) 100 } 101 } else { 102 t.Error(err) 103 } 104 } 105 106 func Test_Set7(t *testing.T) { 107 e := []byte(`{"0":[null,[1,2,3]],"k1":"v1","k2":"v2"}`) 108 p := gjson.New(map[string]string{ 109 "k1": "v1", 110 "k2": "v2", 111 }) 112 p.Set("0.1", []int{1, 2, 3}) 113 if c, err := p.ToJson(); err == nil { 114 115 if !bytes.Equal(c, e) { 116 t.Error("expect:", string(e)) 117 } 118 } else { 119 t.Error(err) 120 } 121 } 122 123 func Test_Set8(t *testing.T) { 124 e := []byte(`{"0":[[[[[[null,[1,2,3]]]]]]],"k1":"v1","k2":"v2"}`) 125 p := gjson.New(map[string]string{ 126 "k1": "v1", 127 "k2": "v2", 128 }) 129 p.Set("0.0.0.0.0.0.1", []int{1, 2, 3}) 130 if c, err := p.ToJson(); err == nil { 131 132 if !bytes.Equal(c, e) { 133 t.Error("expect:", string(e)) 134 } 135 } else { 136 t.Error(err) 137 } 138 } 139 140 func Test_Set9(t *testing.T) { 141 e := []byte(`{"k1":[null,[1,2,3]],"k2":"v2"}`) 142 p := gjson.New(map[string]string{ 143 "k1": "v1", 144 "k2": "v2", 145 }) 146 p.Set("k1.1", []int{1, 2, 3}) 147 if c, err := p.ToJson(); err == nil { 148 149 if !bytes.Equal(c, e) { 150 t.Error("expect:", string(e)) 151 } 152 } else { 153 t.Error(err) 154 } 155 } 156 157 func Test_Set10(t *testing.T) { 158 e := []byte(`{"a":{"b":{"c":1}}}`) 159 p := gjson.New(nil) 160 p.Set("a.b.c", 1) 161 if c, err := p.ToJson(); err == nil { 162 163 if !bytes.Equal(c, e) { 164 t.Error("expect:", string(e)) 165 } 166 } else { 167 t.Error(err) 168 } 169 } 170 171 func Test_Set11(t *testing.T) { 172 e := []byte(`{"a":{"b":{}}}`) 173 p, _ := gjson.LoadContent([]byte(`{"a":{"b":{"c":1}}}`)) 174 p.Remove("a.b.c") 175 if c, err := p.ToJson(); err == nil { 176 177 if !bytes.Equal(c, e) { 178 t.Error("expect:", string(e)) 179 } 180 } else { 181 t.Error(err) 182 } 183 } 184 185 func Test_Set12(t *testing.T) { 186 e := []byte(`[0,1]`) 187 p := gjson.New(nil) 188 p.Set("0", 0) 189 p.Set("1", 1) 190 if c, err := p.ToJson(); err == nil { 191 192 if !bytes.Equal(c, e) { 193 t.Error("expect:", string(e)) 194 } 195 } else { 196 t.Error(err) 197 } 198 } 199 200 func Test_Set13(t *testing.T) { 201 e := []byte(`{"array":[0,1]}`) 202 p := gjson.New(nil) 203 p.Set("array.0", 0) 204 p.Set("array.1", 1) 205 if c, err := p.ToJson(); err == nil { 206 207 if !bytes.Equal(c, e) { 208 t.Error("expect:", string(e)) 209 } 210 } else { 211 t.Error(err) 212 } 213 } 214 215 func Test_Set14(t *testing.T) { 216 e := []byte(`{"f":{"a":1}}`) 217 p := gjson.New(nil) 218 p.Set("f", "m") 219 p.Set("f.a", 1) 220 if c, err := p.ToJson(); err == nil { 221 222 if !bytes.Equal(c, e) { 223 t.Error("expect:", string(e)) 224 } 225 } else { 226 t.Error(err) 227 } 228 } 229 230 func Test_Set15(t *testing.T) { 231 gtest.C(t, func(t *gtest.T) { 232 j := gjson.New(nil) 233 234 t.Assert(j.Set("root.0.k1", "v1"), nil) 235 t.Assert(j.Set("root.1.k2", "v2"), nil) 236 t.Assert(j.Set("k", "v"), nil) 237 238 s, err := j.ToJsonString() 239 t.AssertNil(err) 240 t.Assert( 241 gstr.Contains(s, `"root":[{"k1":"v1"},{"k2":"v2"}`) || 242 gstr.Contains(s, `"root":[{"k2":"v2"},{"k1":"v1"}`), 243 true, 244 ) 245 t.Assert( 246 gstr.Contains(s, `{"k":"v"`) || 247 gstr.Contains(s, `"k":"v"}`), 248 true, 249 ) 250 }) 251 } 252 253 func Test_Set16(t *testing.T) { 254 gtest.C(t, func(t *gtest.T) { 255 j := gjson.New(nil) 256 257 t.Assert(j.Set("processors.0.set.0value", "1"), nil) 258 t.Assert(j.Set("processors.0.set.0field", "2"), nil) 259 t.Assert(j.Set("description", "3"), nil) 260 261 s, err := j.ToJsonString() 262 t.AssertNil(err) 263 t.Assert( 264 gstr.Contains(s, `"processors":[{"set":{"0field":"2","0value":"1"}}]`) || 265 gstr.Contains(s, `"processors":[{"set":{"0value":"1","0field":"2"}}]`), 266 true, 267 ) 268 t.Assert( 269 gstr.Contains(s, `{"description":"3"`) || gstr.Contains(s, `"description":"3"}`), 270 true, 271 ) 272 }) 273 } 274 275 func Test_Set17(t *testing.T) { 276 gtest.C(t, func(t *gtest.T) { 277 j := gjson.New(nil) 278 279 t.Assert(j.Set("0.k1", "v1"), nil) 280 t.Assert(j.Set("1.k2", "v2"), nil) 281 // overwrite the previous slice. 282 t.Assert(j.Set("k", "v"), nil) 283 284 s, err := j.ToJsonString() 285 t.AssertNil(err) 286 t.Assert(s, `{"k":"v"}`) 287 }) 288 } 289 290 func Test_Set18(t *testing.T) { 291 gtest.C(t, func(t *gtest.T) { 292 j := gjson.New(nil) 293 294 t.Assert(j.Set("0.1.k1", "v1"), nil) 295 t.Assert(j.Set("0.2.k2", "v2"), nil) 296 s, err := j.ToJsonString() 297 t.AssertNil(err) 298 t.Assert(s, `[[null,{"k1":"v1"},{"k2":"v2"}]]`) 299 }) 300 } 301 302 func Test_Set19(t *testing.T) { 303 gtest.C(t, func(t *gtest.T) { 304 j := gjson.New(nil) 305 306 t.Assert(j.Set("0.1.1.k1", "v1"), nil) 307 t.Assert(j.Set("0.2.1.k2", "v2"), nil) 308 s, err := j.ToJsonString() 309 t.AssertNil(err) 310 t.Assert(s, `[[null,[null,{"k1":"v1"}],[null,{"k2":"v2"}]]]`) 311 }) 312 } 313 314 func Test_Set20(t *testing.T) { 315 gtest.C(t, func(t *gtest.T) { 316 j := gjson.New(nil) 317 318 t.Assert(j.Set("k1", "v1"), nil) 319 t.Assert(j.Set("k2", g.Slice{1, 2, 3}), nil) 320 t.Assert(j.Set("k2.1", 20), nil) 321 t.Assert(j.Set("k2.2", g.Map{"k3": "v3"}), nil) 322 s, err := j.ToJsonString() 323 t.AssertNil(err) 324 t.Assert(gstr.InArray( 325 g.SliceStr{ 326 `{"k1":"v1","k2":[1,20,{"k3":"v3"}]}`, 327 `{"k2":[1,20,{"k3":"v3"}],"k1":"v1"}`, 328 }, 329 s, 330 ), true) 331 }) 332 } 333 334 func Test_Set_GArray(t *testing.T) { 335 gtest.C(t, func(t *gtest.T) { 336 j := gjson.New(nil) 337 arr := garray.New().Append("test") 338 t.AssertNil(j.Set("arr", arr)) 339 t.Assert(j.Get("arr").Array(), g.Slice{"test"}) 340 }) 341 } 342 343 func Test_Set_WithEmptyStruct(t *testing.T) { 344 gtest.C(t, func(t *gtest.T) { 345 j := gjson.New(&struct{}{}) 346 t.AssertNil(j.Set("aa", "123")) 347 t.Assert(j.MustToJsonString(), `{"aa":"123"}`) 348 }) 349 }