Golang处理JSON中的嵌套对象(非数组)解析问题

Golang处理JSON中的嵌套对象(非数组)解析问题 基本上,我正在尝试使用结构体来处理JSON和嵌套的JSON对象(不是数组形式[])。我敢肯定这非常简单,但为什么我很难使用两种结构体类型创建一个深度为一层的嵌套JSON对象呢?

package main

import (
	"encoding/json"
	"fmt"
)

type MetaData struct {
	Country string `json:"countryScope"`
	Asset   string `json:"assetScope"`
}

type BusEvent struct {
	MedaData MetaData `json:"metaData"`
	Name string
}

func main() {
	resp := BusEvent{
		MetaData{
			Country: "test",
			Asset:   "test",
		},
		Name: "test",
	}
	js, _ := json.Marshal(resp)
	fmt.Printf("%s", js)
}

https://play.golang.org/p/siMDC2MNX-V


更多关于Golang处理JSON中的嵌套对象(非数组)解析问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

失败信息如下:

./prog.go:20:11: 混合使用了字段:值和值初始化器

更多关于Golang处理JSON中的嵌套对象(非数组)解析问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢 @lutzhorn!我就知道会有人给我指明正确的方向。太棒了,非常感谢。

David_Gates:

MedaData MetaData `json:"metaData"`

这 (MedaData) 很可能是个拼写错误。

错误信息已经说明了一切。请这样做:

resp := BusEvent{
    MetaData: MetaData{
        Country: "test",
        Asset:   "test",
    },
    Name: "test",
}

但这与 JSON 无关,只是关于如何构建 struct

查看 Go Playground - The Go Programming Language 的输出:

{"metaData":{"countryScope":"test","assetScope":"test"},"Name":"test"}

你的代码已经基本正确,但结构体初始化时字段名需要明确指定。以下是修正后的版本:

package main

import (
	"encoding/json"
	"fmt"
)

type MetaData struct {
	Country string `json:"countryScope"`
	Asset   string `json:"assetScope"`
}

type BusEvent struct {
	MetaData MetaData `json:"metaData"`
	Name     string   `json:"name"`
}

func main() {
	// 正确初始化嵌套结构体
	resp := BusEvent{
		MetaData: MetaData{
			Country: "test",
			Asset:   "test",
		},
		Name: "test",
	}
	
	js, _ := json.Marshal(resp)
	fmt.Printf("%s\n", js)
	
	// 解析示例
	jsonStr := `{"metaData":{"countryScope":"USA","assetScope":"stock"},"name":"event1"}`
	var event BusEvent
	json.Unmarshal([]byte(jsonStr), &event)
	fmt.Printf("Parsed: %+v\n", event)
}

输出结果:

{"metaData":{"countryScope":"test","assetScope":"test"},"name":"test"}
Parsed: {MetaData:{Country:USA Asset:stock} Name:event1}

关键点:

  1. 初始化嵌套结构体时需要指定字段名 MetaData:
  2. 结构体字段标签 json:"metaData" 确保JSON键名正确映射
  3. 添加了JSON解析示例展示双向转换

如果JSON键名需要不同命名,只需调整结构体标签即可。

回到顶部