228 lines
4.6 KiB
Go
228 lines
4.6 KiB
Go
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)
|
||
// }
|