157
jsonx/json.go
Normal file
157
jsonx/json.go
Normal file
@@ -0,0 +1,157 @@
|
||||
package jsonx
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ToRawMessage(i interface{}, defaultValue string) (json.RawMessage, error) {
|
||||
m := json.RawMessage{}
|
||||
var b []byte
|
||||
var err error
|
||||
b, err = json.Marshal(&i)
|
||||
if err != nil {
|
||||
return m, err
|
||||
}
|
||||
|
||||
b = bytes.TrimSpace(b)
|
||||
if len(b) == 0 || bytes.EqualFold(b, []byte("null")) {
|
||||
b = []byte(defaultValue)
|
||||
}
|
||||
err = m.UnmarshalJSON(b)
|
||||
return m, err
|
||||
}
|
||||
|
||||
// ToJson Change interface to json string
|
||||
func ToJson(i interface{}, defaultValue string) string {
|
||||
if i == nil {
|
||||
return defaultValue
|
||||
}
|
||||
vo := reflect.ValueOf(i)
|
||||
switch vo.Kind() {
|
||||
case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice:
|
||||
if vo.IsNil() {
|
||||
return defaultValue
|
||||
}
|
||||
default:
|
||||
}
|
||||
|
||||
b, err := json.Marshal(i)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
var buf bytes.Buffer
|
||||
err = json.Compact(&buf, b)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
if json.Valid(buf.Bytes()) {
|
||||
return buf.String()
|
||||
}
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
func ToPrettyJson(i interface{}) string {
|
||||
if i == nil {
|
||||
return "null"
|
||||
}
|
||||
vo := reflect.ValueOf(i)
|
||||
switch vo.Kind() {
|
||||
case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice:
|
||||
if vo.IsNil() {
|
||||
return "null"
|
||||
}
|
||||
default:
|
||||
}
|
||||
|
||||
b, err := json.Marshal(i)
|
||||
if err != nil {
|
||||
return fmt.Sprintf("%+v", i)
|
||||
}
|
||||
var buf bytes.Buffer
|
||||
err = json.Indent(&buf, b, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Sprintf("%+v", i)
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// EmptyObjectRawMessage 空对象
|
||||
func EmptyObjectRawMessage() json.RawMessage {
|
||||
v := json.RawMessage{}
|
||||
_ = v.UnmarshalJSON([]byte("{}"))
|
||||
|
||||
return v
|
||||
}
|
||||
|
||||
// EmptyArrayRawMessage 空数组
|
||||
func EmptyArrayRawMessage() json.RawMessage {
|
||||
v := json.RawMessage{}
|
||||
_ = v.UnmarshalJSON([]byte("[]"))
|
||||
return v
|
||||
}
|
||||
|
||||
// IsEmptyRawMessage 验证数据是否为空
|
||||
func IsEmptyRawMessage(data json.RawMessage) bool {
|
||||
if data == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
b, err := data.MarshalJSON()
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
|
||||
s := string(bytes.TrimSpace(b))
|
||||
if s == "" || s == "[]" || s == "{}" || strings.EqualFold(s, "null") {
|
||||
return true
|
||||
}
|
||||
|
||||
if strings.Index(s, " ") != -1 {
|
||||
s = strings.ReplaceAll(s, " ", "")
|
||||
}
|
||||
return s == "[]" || s == "{}"
|
||||
}
|
||||
|
||||
func Convert(from json.RawMessage, to any) error {
|
||||
if IsEmptyRawMessage(from) {
|
||||
return nil
|
||||
}
|
||||
|
||||
var b []byte
|
||||
b, err := from.MarshalJSON()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return json.Unmarshal(b, &to)
|
||||
}
|
||||
|
||||
// Extract 提取字符串中的有效 JSON 数据
|
||||
// 比如 `{"a": 1, "b": 2}}}}a` 提取后的数据为 `{"a": 1, "b": 2}`
|
||||
func Extract(str string) (string, error) {
|
||||
str = strings.TrimSpace(str)
|
||||
n := len(str)
|
||||
if n == 0 {
|
||||
return "", errors.New("jsonx: empty string")
|
||||
}
|
||||
if json.Valid([]byte(str)) {
|
||||
return str, nil
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
if str[i] == '{' || str[i] == '[' {
|
||||
for j := n; j > i; j-- {
|
||||
substr := str[i:j]
|
||||
if json.Valid([]byte(substr)) {
|
||||
return substr, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return "", errors.New("jsonx: not found")
|
||||
}
|
||||
Reference in New Issue
Block a user