// Package jsonutil 提供各对象目录(store、skills、specialists、xapps、api)共用的 // JSON 序列化与合法性校验辅助函数。 // // 该包是最底层的中立工具包:不引用任何业务/域包,只依赖标准库,因此能被 // store(最底层数据层)与各领域、api 层同时导入而不会产生 import 循环。 // 各领域原来的 mustJSON / ValidateJSONObjectJSON / ValidateJSONStringArray / // ValidateStructuredRecordsJSON 实现统一收敛到这里,避免重复。 package jsonutil import ( "encoding/json" "strings" ) // MustJSON 序列化任意值;序列化失败时返回 "[]"(与历史行为一致)。 func MustJSON(v any) string { data, err := json.Marshal(v) if err != nil { return "[]" } return string(data) } // ValidateObjectJSON 校验 value 是否为合法的「对象」JSON(空串视为合法)。 func ValidateObjectJSON(value string) bool { if trimJSON(value) == "" { return true } var obj map[string]any return json.Unmarshal([]byte(trimJSON(value)), &obj) == nil } // ValidateStringArrayJSON 校验 value 是否为合法的「字符串数组」JSON(空串视为合法)。 func ValidateStringArrayJSON(value string) bool { if trimJSON(value) == "" { return true } var arr []string return json.Unmarshal([]byte(trimJSON(value)), &arr) == nil } // ValidateStructuredRecordsJSON 校验 value 是否为合法的「结构化记录数组」JSON(空串视为合法)。 func ValidateStructuredRecordsJSON(value string) bool { if trimJSON(value) == "" { return true } var arr []map[string]any return json.Unmarshal([]byte(trimJSON(value)), &arr) == nil } func trimJSON(value string) string { return strings.TrimSpace(value) } // ParseJSON 安全反序列化 JSON 字符串;空串返回 nil(不报错)。 func ParseJSON(data string, v any) error { if trimJSON(data) == "" { return nil } return json.Unmarshal([]byte(data), v) } // ParseStringArray 解析 JSON 字符串数组;空串返回 nil(不报错)。 func ParseStringArray(data string) ([]string, error) { if trimJSON(data) == "" { return nil, nil } var arr []string if err := json.Unmarshal([]byte(data), &arr); err != nil { return nil, err } if arr == nil { return []string{}, nil } return arr, nil } // ParseObject 解析 JSON 对象;空串返回 nil map(不报错)。 func ParseObject(data string) (map[string]any, error) { if trimJSON(data) == "" { return nil, nil } var obj map[string]any if err := json.Unmarshal([]byte(data), &obj); err != nil { return nil, err } return obj, nil } // ParseArray 解析任意 JSON 数组;空串返回 nil(不报错)。 func ParseArray(data string, v any) error { if trimJSON(data) == "" { return nil } return json.Unmarshal([]byte(data), v) }