更新处理器
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
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]
|
||||
}
|
||||
Reference in New Issue
Block a user