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

Go语言解析嵌套JSON:如何修改结构体实现正确解析

解决Go语言解析嵌套JSON的问题

首先,你的代码有两个关键问题导致解析失败:

  • 结构体的id字段是小写开头,Go的json包无法访问未导出的字段(只有大写开头的字段才会被序列化/反序列化)。
  • Lists字段定义为[]string,但JSON中lists是对象数组,不是字符串数组,类型完全不匹配。

修改后的结构体定义

我们需要先定义一个子结构体来对应lists数组中的每个对象,再将Lists字段改为这个子结构体的切片,同时修正字段的导出权限:

// 定义lists数组中的元素结构体
type ListItem struct {
    EmployeeID  string `json:"empoyee_id,omitempty"` // 注意你JSON里的拼写是empoyee_id(少了一个l),如果是笔误可以改成employee_id
    ContractorID string `json:"contractor_id,omitempty"`
    Name        string `json:"name"`
}

// 主结构体
type Result struct {
    ID   int64     `json:"id"` // 改为大写开头,让json包能访问
    Date string    `json:"date"`
    Lists []ListItem `json:"lists"` // 改为ListItem切片,对应JSON中的对象数组
}

为什么这样修改?

  1. 字段导出:Go语言中,只有大写开头的结构体字段是导出的,json.Unmarshal只能处理导出字段,所以必须把id改成ID。
  2. 匹配JSON结构:JSON里的lists是包含多个对象的数组,每个对象有name和要么empoyee_id要么contractor_id,所以我们用ListItem结构体来描述这些对象,再用[]ListItem作为Lists的类型,完美匹配JSON的嵌套结构。

完整解析示例

package main

import (
    "encoding/json"
    "fmt"
)

type ListItem struct {
    EmployeeID  string `json:"empoyee_id,omitempty"`
    ContractorID string `json:"contractor_id,omitempty"`
    Name        string `json:"name"`
}

type Result struct {
    ID   int64     `json:"id"`
    Date string    `json:"date"`
    Lists []ListItem `json:"lists"`
}

func main() {
    contents := []byte(`{ "id" : 12345656, "date" : "2018-05-02-18-16-17", "lists" : [ { "empoyee_id": "12343", "name": "User1" }, { "contractor_id" : "12343", "name": "User1" }, { "contractor_id" : "12343", "name": "User1" } ] }`)
    
    var result Result
    err := json.Unmarshal(contents, &result)
    if err != nil {
        fmt.Println("解析错误:", err)
        return
    }
    
    fmt.Printf("解析结果: %+v\n", result)
}

运行这段代码就能正确解析你的嵌套JSON了,每个ListItem会根据JSON中的字段填充对应的EmployeeID或ContractorID,另一个因为加了omitempty标签会被忽略。

内容的提问来源于stack exchange,提问作者jsor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:20