Files
hyapi-server/internal/domains/api/services/processors/shujubao_recursive_parse.go
2026-06-10 20:32:24 +08:00

59 lines
1.4 KiB
Go

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]
}