36 lines
		
	
	
		
			752 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			36 lines
		
	
	
		
			752 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package lzUtils | ||
|  | 
 | ||
|  | import "github.com/bytedance/sonic" | ||
|  | 
 | ||
|  | func RecursiveParse(data interface{}) (interface{}, error) { | ||
|  | 	switch v := data.(type) { | ||
|  | 	case string: | ||
|  | 		// 尝试解析字符串是否为嵌套 JSON | ||
|  | 		var parsed interface{} | ||
|  | 		if err := sonic.Unmarshal([]byte(v), &parsed); err == nil { | ||
|  | 			return RecursiveParse(parsed) | ||
|  | 		} | ||
|  | 		return v, nil // 普通字符串直接返回 | ||
|  | 	case map[string]interface{}: | ||
|  | 		for key, val := range v { | ||
|  | 			parsed, err := RecursiveParse(val) | ||
|  | 			if err != nil { | ||
|  | 				return nil, err | ||
|  | 			} | ||
|  | 			v[key] = parsed | ||
|  | 		} | ||
|  | 		return v, nil | ||
|  | 	case []interface{}: | ||
|  | 		for i, item := range v { | ||
|  | 			parsed, err := RecursiveParse(item) | ||
|  | 			if err != nil { | ||
|  | 				return nil, err | ||
|  | 			} | ||
|  | 			v[i] = parsed | ||
|  | 		} | ||
|  | 		return v, nil | ||
|  | 	default: | ||
|  | 		return v, nil | ||
|  | 	} | ||
|  | } |