fix: 支持解析单个JSON对象为单元素数组

This commit is contained in:
2026-07-08 13:37:09 +08:00
parent b8006329d1
commit a7f30d1640
+29 -8
View File
@@ -33,24 +33,45 @@ func ParseAndValidate(raw map[string]any, requiredFields []string) (map[string]a
return r
}, contentStr)
var arr []any
if err := json.Unmarshal([]byte(contentStr), &arr); err != nil {
// 第一步:先解析为通用 interface{},判断是对象还是数组
var data any
if err := json.Unmarshal([]byte(contentStr), &data); err != nil {
return raw, fmt.Errorf("JSON解析失败: %w", err)
}
if len(arr) == 0 {
return raw, fmt.Errorf("解析后数组为空")
var arr []any
switch val := data.(type) {
case []any:
// 本身就是数组,直接赋值
arr = val
case map[string]any:
// 单个对象,包装成单元素数组,统一后续逻辑
arr = []any{val}
default:
return raw, fmt.Errorf("不支持的JSON类型,仅允许对象/数组")
}
if len(arr) == 0 {
return raw, fmt.Errorf("解析后数据数组为空")
}
// 校验每一项的必填字段
for _, field := range requiredFields {
for i, r := range arr {
round, _ := r.(map[string]any)
if round != nil && gjson.New(round).Get(field).IsNil() {
for i, item := range arr {
itemMap, ok := item.(map[string]any)
if !ok {
return raw, fmt.Errorf("rounds[%d] 不是合法JSON对象", i)
}
if gjson.New(itemMap).Get(field).IsNil() {
return raw, fmt.Errorf("rounds[%d] 缺少必填字段: %s", i, field)
}
}
}
return map[string]any{"total_rounds": len(arr), "rounds": arr}, nil
return map[string]any{
"total_rounds": len(arr),
"rounds": arr,
}, nil
}
// ParseStructResult 解析结构结果