fix: 支持解析单个JSON对象为单元素数组
This commit is contained in:
+29
-8
@@ -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 解析结构结果
|
||||
|
||||
Reference in New Issue
Block a user