182 lines
4.2 KiB
Go
182 lines
4.2 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/sjson"
|
|
|
|
"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",
|
|
},
|
|
"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)
|
|
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},
|
|
{"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": 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)
|
|
// fmt.Println(jsonStr)
|
|
var pathExpendRes = &ExpendArrayResult{
|
|
PathList: nil,
|
|
PathMap: nil,
|
|
}
|
|
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 {
|
|
res, _ = sjson.Set(res, pathExpendRes.PathMap[item], gjson.Get(jsonStr, item).Value())
|
|
}
|
|
fmt.Println(res)
|
|
}
|