You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言中将带索引的JSON对象转换为JSON数组

将JSON对象转换为数组:Go语言实现

你需要把外层以数字为键的对象转换为数组,下面是具体的实现步骤和代码:

实现思路

  1. 解析原始JSON:将输入的JSON字符串反序列化为Go语言的数据结构,方便后续操作。
  2. 提取对象值:从data字段对应的映射中取出所有值,这些值就是我们要放入数组的元素。
  3. 构建目标结构:创建新的结构体,将提取出的值存入数组,再序列化为符合要求的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:22:14