如何递归转换map[string]interface{}中的[]interface{}为[]map[string]interface{}
递归转换嵌套[]interface{}为[]map[string]interface{}适配go-xlsx-templater
当然可以通过递归遍历实现自动转换,核心逻辑是深度遍历数据结构,针对性处理嵌套的数组和map:
- 遇到
map[string]interface{}时,递归处理其每个键值对 - 遇到
[]interface{}时,遍历数组元素,将每个map类型的元素转换后存入[]map[string]interface{} - 其他基础类型直接保留
示例实现代码
func transformData(data interface{}) interface{} { switch v := data.(type) { case map[string]interface{}: for key, val := range v { v[key] = transformData(val) } return v case []interface{}: var transformedSlice []map[string]interface{} for _, item := range v { if itemMap, ok := item.(map[string]interface{}); ok { transformedSlice = append(transformedSlice, transformData(itemMap).(map[string]interface{})) } // 若数组元素非map类型,可根据需求补充处理逻辑(如保留原元素、抛出错误等) } return transformedSlice default: return v } }
使用方式
将JSON解析后的map[string]interface{}传入函数,即可得到符合要求的结构:
// 假设parsedJSON是解析后的原始数据 adaptedData := transformData(parsedJSON).(map[string]interface{})
这个递归函数会自动处理所有层级的嵌套结构,完全替代手动转换的重复工作。如果业务场景中存在数组元素非map的情况,可在对应分支补充适配逻辑。
内容的提问来源于stack exchange,提问作者jcromanu
相关产品推荐
相关产品推荐

