mirror of
https://github.com/unti-io/go-utils.git
synced 2025-10-05 16:26:50 +08:00
94 lines
1.9 KiB
Go
94 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
JSON "encoding/json"
|
|
"fmt"
|
|
json "github.com/json-iterator/go"
|
|
"github.com/spf13/cast"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// Json - JSON 处理
|
|
var Json *JsonClass
|
|
|
|
type JsonClass struct{}
|
|
|
|
// Valid - 验证JSON数据
|
|
func (this *JsonClass) Valid(data any) (result bool) {
|
|
return json.Valid([]byte(cast.ToString(data)))
|
|
}
|
|
|
|
// Encode 编码
|
|
func (this *JsonClass) Encode(data any) (result string) {
|
|
text, err := json.Marshal(data)
|
|
return Ternary(err != nil, "", string(text))
|
|
}
|
|
|
|
// Decode 解码
|
|
func (this *JsonClass) Decode(data any) (result any) {
|
|
err := json.Unmarshal([]byte(cast.ToString(data)), &result)
|
|
return Ternary(err != nil, nil, result)
|
|
}
|
|
|
|
// Unmarshal 解码
|
|
func (this *JsonClass) Unmarshal(data []byte, result any) (err error) {
|
|
return JSON.Unmarshal(data, result)
|
|
}
|
|
|
|
// Get 获取json中的值 - 支持多级
|
|
func (this *JsonClass) Get(jsonString any, key any) (result any, err error) {
|
|
|
|
if err := json.Unmarshal([]byte(cast.ToString(jsonString)), &result); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
keys := strings.Split(cast.ToString(key), ".")
|
|
|
|
for _, key := range keys {
|
|
object, ok := result.(map[string]any)
|
|
if !ok {
|
|
return nil, fmt.Errorf("invalid key: %v", key)
|
|
}
|
|
val, ok := object[key]
|
|
if !ok {
|
|
return nil, fmt.Errorf("key not found: %v", key)
|
|
}
|
|
result = val
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// String map转json字符串
|
|
func (this *JsonClass) String(data any) (result string) {
|
|
|
|
item := cast.ToStringMap(data)
|
|
|
|
// 将map的key排序
|
|
keys := make([]string, 0, len(item))
|
|
for key := range item {
|
|
keys = append(keys, key)
|
|
}
|
|
sort.Strings(keys)
|
|
|
|
// 构建有序的map
|
|
order := make(map[string]any)
|
|
for _, key := range keys {
|
|
order[key] = item[key]
|
|
}
|
|
|
|
// 转换为JSON字符串
|
|
bytes, err := json.Marshal(order)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
// 判断是否为空
|
|
if string(bytes) == "{}" {
|
|
return ""
|
|
}
|
|
|
|
return string(bytes)
|
|
}
|