202 lines
5.1 KiB
Go
202 lines
5.1 KiB
Go
// Package gjson_hack ...
|
|
//
|
|
// Description : gjson_hack ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 2024-11-27 15:52
|
|
package gjson_hack
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/tidwall/gjson"
|
|
)
|
|
|
|
func TestPath(t *testing.T) {
|
|
mapData := map[string]any{
|
|
"person_list": []map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
"company_info": map[string]any{
|
|
"address": "Beijing",
|
|
"email": "xxx@xxx.com",
|
|
},
|
|
"sex": "man",
|
|
}
|
|
byteData, _ := json.Marshal(mapData)
|
|
pathRes, err := Path(string(byteData), nil)
|
|
if nil != err {
|
|
fmt.Println(err.Error())
|
|
} else {
|
|
for _, item := range pathRes.List {
|
|
fmt.Println(item)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPathOnlyFinallyPath(t *testing.T) {
|
|
mapData := map[string]any{
|
|
"person_list": []map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
"company_info": map[string]any{
|
|
"address": "Beijing",
|
|
"email": "xxx@xxx.com",
|
|
},
|
|
"sex": "man",
|
|
"user_list": [][]map[string]any{
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 20},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 30},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
},
|
|
}
|
|
byteData, _ := json.Marshal(mapData)
|
|
fmt.Println(gjson.GetBytes(byteData, "user_list.#.#.age"))
|
|
fmt.Println(gjson.GetBytes(byteData, "user_list.0.0.age"))
|
|
pathRes, err := Path(string(byteData), &PathOption{
|
|
UnfoldArray: false,
|
|
MaxDeep: 0,
|
|
OnlyFinalPath: true,
|
|
})
|
|
if nil != err {
|
|
fmt.Println(err.Error())
|
|
} else {
|
|
for _, item := range pathRes.List {
|
|
fmt.Println(item)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPathOnlyFinallyPathWithUnfoldArray(t *testing.T) {
|
|
mapData := map[string]any{
|
|
"person_list": []map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
"company_info": map[string]any{
|
|
"address": "Beijing",
|
|
"email": "xxx@xxx.com",
|
|
"a.b": "cd",
|
|
},
|
|
"sex": "man",
|
|
"user_list": [][]map[string]any{
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10, "e.f": "g"},
|
|
{"name": "li", "age": 20, "e.f": "g"},
|
|
{"name": "wang", "age": 30, "e.f": "g"},
|
|
},
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
},
|
|
}
|
|
byteData, _ := json.Marshal(mapData)
|
|
pathRes, err := Path(string(byteData), &PathOption{
|
|
UnfoldArray: true,
|
|
MaxDeep: 0,
|
|
OnlyFinalPath: false,
|
|
})
|
|
if nil != err {
|
|
fmt.Println(err.Error())
|
|
} else {
|
|
for _, item := range pathRes.List {
|
|
fmt.Println(item)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestExpandArrayPath(t *testing.T) {
|
|
mapData := map[string]any{
|
|
"person_list": []map[string]any{
|
|
{"name": "zhang", "age": 10, "a.b": "people_name"},
|
|
{"name": "li", "age": 20, "a.b": "people_name"},
|
|
{"name": "wang", "age": 30, "a.b": "people_name"},
|
|
},
|
|
"company_info": map[string]any{
|
|
"address": "Beijing",
|
|
"email": "xxx@xxx.com",
|
|
"level.a.b": "deep level",
|
|
},
|
|
"sex": "man",
|
|
"user_list": [][]map[string]any{
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
[]map[string]any{
|
|
{"name": "zhang", "age": 10},
|
|
{"name": "li", "age": 20},
|
|
{"name": "wang", "age": 30},
|
|
},
|
|
},
|
|
}
|
|
byteData, _ := json.Marshal(mapData)
|
|
jsonStr := string(byteData)
|
|
|
|
var pathExpendRes = &ExpendArrayResult{
|
|
PathList: nil,
|
|
PathMap: nil,
|
|
}
|
|
ExpandArrayPath(jsonStr, "company_info.{{#level.a.b#}}", "company_info.a-b", pathExpendRes)
|
|
ExpandArrayPath(jsonStr, "person_list.{{idx}}.{{#a.b#}}", "person_list.{{idx}}.a-b", pathExpendRes)
|
|
ExpandArrayPath(jsonStr, "user_list.{{idx}}.{{idx}}.age", "a.{{idx}}.{{idx}}.b", pathExpendRes)
|
|
ExpandArrayPath(jsonStr, "user_list.{{idx}}.{{idx}}.name", "e.{{idx}}.{{idx}}.c", pathExpendRes)
|
|
ExpandArrayPath(jsonStr, "user_list.{{idx}}.{{idx}}.sex", "f.{{idx}}.{{idx}}.c", pathExpendRes)
|
|
// res := ""
|
|
for _, item := range pathExpendRes.PathList {
|
|
// fmt.Println(item, pathExpendRes.PathMap[item])
|
|
fmt.Println(item, pathExpendRes.PathMap[item], Get(gjson.Parse(jsonStr), item).String())
|
|
// res, _ = sjson.Set(res, pathExpendRes.PathMap[item], Get(gjson.Parse(jsonStr), item).Value())
|
|
}
|
|
}
|
|
|
|
func TestGet(t *testing.T) {
|
|
mapData := map[string]any{
|
|
"person.name": "test",
|
|
"test": map[string]any{
|
|
"a.b": "c",
|
|
"d.e": map[string]any{
|
|
"e.f": "g",
|
|
},
|
|
},
|
|
}
|
|
byteData, _ := json.Marshal(mapData)
|
|
gjsonResult := gjson.ParseBytes(byteData)
|
|
fmt.Println(Get(gjsonResult, "{{#person.name#}}").String())
|
|
fmt.Println(Get(gjsonResult, "test.{{#a.b#}}").String())
|
|
fmt.Println(Get(gjsonResult, "test.{{#d.e#}}.{{#e.f#}}").String())
|
|
}
|