package processors import ( "encoding/json" "fmt" ) // RecursiveParse 将数据宝等返回中嵌套的 JSON 字符串递归解析为结构化数据。 func RecursiveParse(data interface{}) (interface{}, error) { switch v := data.(type) { case string: trimmed := trimSpace(v) if trimmed == "" { return v, nil } if !json.Valid([]byte(trimmed)) { return v, nil } var inner interface{} if err := json.Unmarshal([]byte(trimmed), &inner); err != nil { return v, nil } return RecursiveParse(inner) case map[string]interface{}: out := make(map[string]interface{}, len(v)) for k, val := range v { parsed, err := RecursiveParse(val) if err != nil { return nil, fmt.Errorf("解析字段 %s 失败: %w", k, err) } out[k] = parsed } return out, nil case []interface{}: out := make([]interface{}, len(v)) for i, val := range v { parsed, err := RecursiveParse(val) if err != nil { return nil, fmt.Errorf("解析数组下标 %d 失败: %w", i, err) } out[i] = parsed } return out, nil default: return data, nil } } func trimSpace(s string) string { start, end := 0, len(s) for start < end && (s[start] == ' ' || s[start] == '\n' || s[start] == '\r' || s[start] == '\t') { start++ } for end > start && (s[end-1] == ' ' || s[end-1] == '\n' || s[end-1] == '\r' || s[end-1] == '\t') { end-- } return s[start:end] }