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

Go语言中如何将结构体编组为嵌套JSON对象?

解决Go结构体转嵌套JSON的问题

Go标准库的encoding/json包不支持通过带点的JSON标签直接生成嵌套结构,你之前的写法会把"otherStruct.C"当成普通键名,所以达不到嵌套效果。正确的做法是用嵌套结构体来模拟JSON的层级结构,具体实现如下:

正确的结构体定义

你可以直接在MyStruct中内嵌匿名子结构体:

type MyStruct struct {
    A string       `json:"A"`
    B int          `json:"B"`
    OtherStruct struct {
        C string `json:"C"`
        D int    `json:"D"`
    } `json:"otherStruct"`
}

如果需要复用子结构体,也可以单独定义后再嵌入:

type OtherStruct struct {
    C string `json:"C"`
    D int    `json:"D"`
}

type MyStruct struct {
    A string       `json:"A"`
    B int          `json:"B"`
    OtherStruct OtherStruct `json:"otherStruct"`
}

序列化示例代码

package main

import (
    "encoding/json"
    "fmt"
)

type OtherStruct struct {
    C string `json:"C"`
    D int    `json:"D"`
}

type MyStruct struct {
    A string       `json:"A"`
    B int          `json:"B"`
    OtherStruct OtherStruct `json:"otherStruct"`
}

func main() {
    data := MyStruct{
        A: "Some string",
        B: 1234,
        OtherStruct: OtherStruct{
            C: "Other string",
            D: 5678,
        },
    }

    jsonBytes, err := json.MarshalIndent(data, "", "  ")
    if err != nil {
        fmt.Println("序列化错误:", err)
        return
    }

    fmt.Println(string(jsonBytes))
}

输出结果

{
  "A": "Some string",
  "B": 1234,
  "otherStruct": {
    "C": "Other string",
    "D": 5678
  }
}

关键说明

  • Go的JSON序列化完全基于结构体的层级关系生成JSON结构,标签仅用于映射键名,无法通过标签创建新的层级。
  • 如果原始结构体无法修改(比如来自第三方依赖),可以额外定义一个用于序列化的DTO(数据传输对象)结构体,将原始数据复制到DTO后再执行序列化操作。

内容的提问来源于stack exchange,提问作者Felipe Kelemen Bernardino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:14:54