From 36de5934ce1591fb6347d8b34f6550e2fe4811fb Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 16 Jan 2024 16:15:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20super=20=E5=8C=85?= =?UTF-8?q?=20JSON=20=E8=A7=A3=E6=9E=90=E9=83=A8=E5=88=86=E9=9B=B6?= =?UTF-8?q?=E5=80=BC=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/super/json.go | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) 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("{}") + } +}