c5_labsci/zciyon/json.go
2026-01-27 00:52:00 +08:00

228 lines
4.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package zciyon
import (
"bytes"
"encoding/json"
)
// 未来path应支持xxx.[0].xxx
// V0.3
func Getstr(dat any, path string, argdef ...string) string {
defval := ""
if len(argdef) > 0 {
defval = argdef[0]
}
if arr, ok := dat.(map[string]any); ok {
return Tostr(arr[path], defval)
}
return defval
}
func Getint(dat any, path string, argdef ...int) int {
defval := 0
if len(argdef) > 0 {
defval = argdef[0]
}
if arr, ok := dat.(map[string]any); ok {
return Toint(arr[path], defval)
}
return 0
}
func Getfloat(dat any, path string, argdef ...float64) float64 {
defval := 0.0
if len(argdef) > 0 {
defval = argdef[0]
}
if arr, ok := dat.(map[string]any); ok {
return Tofloat(arr[path], defval)
}
return 0.0
}
func Getarr(dat any, path ...string) []any {
if len(path) == 0 {
if arr, ok := dat.([]any); ok {
return arr
}
} else {
if arr, ok := dat.(map[string]any); ok {
if arr2, ok2 := arr[path[0]].([]any); ok2 {
return arr2
}
}
}
return []any{}
}
func Getobj(dat any, path ...string) map[string]any {
if arr, ok := dat.(map[string]any); ok {
if len(path) > 0 {
if arr2, ok2 := arr[path[0]].(map[string]any); ok2 {
return arr2
}
} else {
return arr
}
}
return map[string]any{}
}
func Str_JSON(str string) map[string]any {
var dat any
if err := json.Unmarshal([]byte(str), &dat); err != nil {
return nil
}
switch v := dat.(type) {
case map[string]any:
return v
case []any:
return map[string]any{"arr": v}
case string:
return map[string]any{"str": v}
case float64:
return map[string]any{"num": v}
case bool:
return map[string]any{"bool": v}
default:
return map[string]any{"any": v}
}
}
func Byte_JSON(str []byte) map[string]any {
var dat any
if err := json.Unmarshal(str, &dat); err != nil {
return nil
}
switch v := dat.(type) {
case map[string]any:
return v
case []any:
return map[string]any{"arr": v}
case string:
return map[string]any{"str": v}
case float64:
return map[string]any{"num": v}
case bool:
return map[string]any{"bool": v}
default:
return map[string]any{"any": v}
}
}
func JSON_Byte(dat any) []byte {
b, err := json.Marshal(dat)
if err != nil {
return []byte("{}")
}
if bytes.Equal(b, []byte("null")) {
return []byte("{}")
}
return b
}
func JSON_Str(dat any) string {
b, err := json.Marshal(dat)
if err != nil {
return "{}"
}
if bytes.Equal(b, []byte("null")) {
return "{}"
}
return string(b)
}
// V0.2
// type ciyJSON struct {
// Data any
// }
// func CiyJSON() *ciyJSON {
// return &ciyJSON{map[string]any{}}
// }
// func (thos *ciyJSON) Load(str string) error {
// if err := json.Unmarshal([]byte(str), &thos.Data); err != nil {
// return err
// }
// return nil
// }
// func (thos *ciyJSON) Parse() string {
// b, err := json.Marshal(thos.Data)
// if err != nil {
// return "{}"
// }
// if bytes.Equal(b, []byte("null")) {
// return "{}"
// }
// return string(b)
// }
// func (thos *ciyJSON) Getint(path string, argdat ...any) int {
// var dat any
// if len(argdat) > 0 {
// dat = argdat[0]
// } else {
// dat = thos.Data
// }
// if arr, ok := dat.(map[string]any); ok {
// return Toint(arr[path], 0)
// }
// return 0
// }
// func (thos *ciyJSON) Getstr(path string, argdat ...any) string {
// var dat any
// if len(argdat) > 0 {
// dat = argdat[0]
// } else {
// dat = thos.Data
// }
// if arr, ok := dat.(map[string]any); ok {
// return Tostr(arr[path], "")
// }
// return ""
// }
// func (thos *ciyJSON) Getfloat(path string, argdat ...any) float64 {
// var dat any
// if len(argdat) > 0 {
// dat = argdat[0]
// } else {
// dat = thos.Data
// }
// if arr, ok := dat.(map[string]any); ok {
// return Tofloat(arr[path], 0.0)
// }
// return 0.0
// }
// func (thos *ciyJSON) Getarr(path string, argdat ...any) []any {
// var dat = thos.Data
// if len(argdat) > 0 {
// dat = argdat[0]
// }
// if path == "" {
// if arr, ok := dat.([]any); ok {
// return arr
// }
// } else {
// if arr, ok := dat.(map[string]any); ok {
// if arr2, ok2 := arr[path].([]any); ok2 {
// return arr2
// }
// }
// }
// return []any{}
// }
// func (thos *ciyJSON) Getobj(path string, argdat ...any) map[string]any {
// var dat = thos.Data
// if len(argdat) > 0 {
// dat = argdat[0]
// }
// if arr, ok := dat.(map[string]any); ok {
// if arr2, ok2 := arr[path].(map[string]any); ok2 {
// return arr2
// }
// }
// return map[string]any{}
// }
// V0.1
// type CiyJSON interface {
// Load(str string) error
// Getint(path string) (int, error)
// Getstr(path string) (string, error)
// Get(path string) (any, error)
// Parse() (string, error)
// }