59 lines
1.4 KiB
Go
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]
|
|
}
|