如何在Go语言中将带索引的JSON对象转换为JSON数组
将JSON对象转换为数组:Go语言实现
你需要把外层以数字为键的对象转换为数组,下面是具体的实现步骤和代码:
实现思路
- 解析原始JSON:将输入的JSON字符串反序列化为Go语言的数据结构,方便后续操作。
- 提取对象值:从
data字段对应的映射中取出所有值,这些值就是我们要放入数组的元素。 - 构建目标结构:创建新的结构体,将提取出的值存入数组,再序列化为符合要求的JSON字符串。
完整代码示例
package main import ( "encoding/json" "fmt" "log" ) // 原始JSON对应的临时结构 type OriginalResponse struct { Data map[string]map[string]interface{} `json:"data"` } // 目标JSON对应的结构 type TargetResponse struct { Data []map[string]interface{} `json:"data"` } func main() { // 输入的JSON字符串 inputJSON := `{"data":{"0":{"0":"1","1":"Test1","2":"Test2","DT_RowId":"row_1"}}}` // 反序列化原始JSON var original OriginalResponse err := json.Unmarshal([]byte(inputJSON), &original) if err != nil { log.Fatalf("反序列化失败: %v", err) } // 将map中的值转换为切片 dataSlice := make([]map[string]interface{}, 0, len(original.Data)) for _, value := range original.Data { dataSlice = append(dataSlice, value) } // 构建目标结构 target := TargetResponse{Data: dataSlice} // 序列化为JSON(使用Indent格式化输出,更易读) outputJSON, err := json.MarshalIndent(target, "", " ") if err != nil { log.Fatalf("序列化失败: %v", err) } // 打印结果 fmt.Println(string(outputJSON)) }
代码说明
- 数据结构定义:
OriginalResponse用于接收原始JSON,其中Data是一个嵌套映射,对应外层的数字键和内部的行数据。TargetResponse则是我们想要的最终结构,Data为数组类型。 - 反序列化与序列化:使用
json.Unmarshal解析输入JSON,json.MarshalIndent生成格式化的输出JSON(如果不需要格式化,直接用json.Marshal即可)。 - 转换逻辑:通过遍历原始
Data映射,将所有值收集到切片中,再赋值给目标结构的Data字段,完成从对象到数组的转换。
优化建议(类型安全版)
如果行数据的结构是固定的(比如每个行都包含0、1、2、DT_RowId这几个字段),可以定义具体的结构体来代替map[string]interface{},这样能获得更好的类型安全性,避免运行时的类型断言问题:
type Row struct { Col0 string `json:"0"` Col1 string `json:"1"` Col2 string `json:"2"` RowId string `json:"DT_RowId"` } type OriginalResponse struct { Data map[string]Row `json:"data"` } type TargetResponse struct { Data []Row `json:"data"` }
使用这个版本的结构,代码逻辑基本一致,但能在编译期检查类型错误,让代码更健壮。
内容的提问来源于stack exchange,提问作者Kota Sarath Kumar Achari
相关产品推荐
相关产品推荐

