diff --git a/utils/super/json.go b/utils/super/json.go index 70e375e..61e88c2 100644 --- a/utils/super/json.go +++ b/utils/super/json.go @@ -12,12 +12,7 @@ var json = jsonIter.ConfigCompatibleWithStandardLibrary func MarshalJSON(v interface{}) []byte { b, err := json.Marshal(v) if err != nil { - switch reflect.TypeOf(v).Kind() { - case reflect.Array, reflect.Slice: - return StringToBytes("[]") - default: - return StringToBytes("{}") - } + return jsonZero(v) } return b } @@ -37,12 +32,7 @@ func UnmarshalJSON(data []byte, v interface{}) error { func MarshalIndentJSON(v interface{}, prefix, indent string) []byte { b, err := json.MarshalIndent(v, prefix, indent) if err != nil { - switch reflect.TypeOf(v).Kind() { - case reflect.Array, reflect.Slice: - return StringToBytes("[]") - default: - return StringToBytes("{}") - } + return jsonZero(v) } return b } @@ -51,3 +41,23 @@ func MarshalIndentJSON(v interface{}, prefix, indent string) []byte { func MarshalToTargetWithJSON(src, dest interface{}) error { return json.Unmarshal(MarshalJSON(src), dest) } + +// 获取 json 格式的空对象 +func jsonZero(v any) []byte { + vof := reflect.Indirect(reflect.ValueOf(v)) + switch vof.Kind() { + case reflect.Array, reflect.Slice: + return StringToBytes("[]") + case reflect.Bool: + return StringToBytes("false") // false 在 JSON 中是不合法的,但是 Golang 中能够正确解析 + case + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + return StringToBytes("0") // 0 在 JSON 中是不合法的,但是 Golang 中能够正确解析 + case reflect.String: + return StringToBytes("\"\"") + default: + return StringToBytes("{}") + } +}