Golang中嵌套类型的序列化实现

Golang中嵌套类型的序列化实现 以下是我的代码

package main

import (
	"encoding/json"
	"fmt"
)

type Details struct {
	ID string `json:"id"`
}

type extended struct {
	Details
	tn map[string]string
}

func main() {
	b, _ := json.Marshal(extended{
		Details:  Details{
			ID: "foo",
		},
		tn: map[string]string{
			"test": "bar",
		},
	})

	fmt.Println(string(b))
}

这是我得到的结果

{"id":"foo"}

而我想要得到的是这个

{"id":"foo", "test":"bar"}

感谢您的帮助。


更多关于Golang中嵌套类型的序列化实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

json.Marshal 仅序列化公开的结构体成员:Go Playground - The Go Programming Language

更多关于Golang中嵌套类型的序列化实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


需要将 tn 改为 Tn 以便导出。 私有字段无法进行序列化。

我不希望在原始消息中打印 TN。你的代码打印的是 {"id":"foo","TN":{"test":"bar"}},而我想要的是 {"id":"foo","test":"bar"}

你需要自定义的 JSON 序列化。为你的 Extended 类型编写一个 MarshalJSON() ([]byte, error) 方法。 json package - encoding/json - Go Packages

要实现嵌套类型的序列化,需要将内部字段导出(首字母大写)并添加JSON标签。以下是修改后的代码:

package main

import (
	"encoding/json"
	"fmt"
)

type Details struct {
	ID string `json:"id"`
}

type Extended struct {
	Details
	Tn map[string]string `json:"tn"`
}

func main() {
	b, _ := json.Marshal(Extended{
		Details: Details{
			ID: "foo",
		},
		Tn: map[string]string{
			"test": "bar",
		},
	})

	fmt.Println(string(b))
}

输出结果:

{"id":"foo","tn":{"test":"bar"}}

如果希望将tn字段的内容平铺到顶层,可以使用结构体标签inline

package main

import (
	"encoding/json"
	"fmt"
)

type Details struct {
	ID string `json:"id"`
}

type Extended struct {
	Details
	Tn map[string]string `json:",inline"`
}

func main() {
	b, _ := json.Marshal(Extended{
		Details: Details{
			ID: "foo",
		},
		Tn: map[string]string{
			"test": "bar",
		},
	})

	fmt.Println(string(b))
}

输出结果:

{"id":"foo","test":"bar"}

注意:inline标签是Go 1.8+版本中引入的特性,需要确保使用的Go版本支持。

回到顶部