json_filter/gjson_hack/path_test.go
2024-12-05 16:14:10 +08:00

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())
}