golang 匿名字段解析和序列化问题

1 篇文章 0 订阅
1 篇文章 0 订阅

说明:

golang中包含匿名字段的结构体在解析和序列化(json.Unmarshal和json.Marshal)的时候:

如果对匿名字段指定了解析说明`json:""`,就会变成带层级的字符数组。

如果没指定解析说明,则会平铺。

例子:

匿名字段不加解析说明`json""`,就是和平铺的字符串相互转化 

和平铺的字符串互相转化成功:

package main

import (
	"encoding/json"
	"fmt"
)

func main()  {
	initStr := []byte(`{"father_str":"i am father","son_int":3,"son_str":"i am son"}`)
	father := &Father{}
	err := json.Unmarshal(initStr, father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(father)
	newStr, err := json.Marshal(father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(newStr))
}

type Father struct {
	Son
	FatherStr	string `json:"Father_str"`
}

type Son struct {
	SonStr	string 		`json:"son_str"`
	SonStrInt	int		`json:"son_int"`
}
&{{i am son 3} i am father}
{"son_str":"i am son","son_int":3,"Father_str":"i am father"}

带层级的字符串转化失败

package main

import (
	"encoding/json"
	"fmt"
)

func main()  {
	//initStr := []byte(`{"father_str":"i am father","son_int":3,"son_str":"i am son"}`)
	initStr := []byte(`{"son":{"son_int":3,"son_str":"i am son"},"father_str":"i am father"}`)
	father := &Father{}
	err := json.Unmarshal(initStr, father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(father)
	newStr, err := json.Marshal(father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(newStr))
}

type Father struct {
	Son
	FatherStr	string `json:"Father_str"`
}

type Son struct {
	SonStr	string 		`json:"son_str"`
	SonStrInt	int		`json:"son_int"`
}
&{{ 0} i am father}
{"son_str":"","son_int":0,"Father_str":"i am father"}

二、匿名字段加解析说明`json""`,就必须和带层级的字符串相互转化 

平铺的字符串转化失败

package main

import (
	"encoding/json"
	"fmt"
)

func main()  {
	initStr := []byte(`{"father_str":"i am father","son_int":3,"son_str":"i am son"}`)
	father := &Father{}
	err := json.Unmarshal(initStr, father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(father)
	newStr, err := json.Marshal(father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(newStr))
}

type Father struct {
	Son	`json:"son"`
	FatherStr	string `json:"Father_str"`
}

type Son struct {
	SonStr	string 		`json:"son_str"`
	SonStrInt	int		`json:"son_int"`
}
&{{ 0} i am father}
{"son":{"son_str":"","son_int":0},"Father_str":"i am father"}

 和带层级的结构体互相转化成功

package main

import (
	"encoding/json"
	"fmt"
)

func main()  {
	initStr := []byte(`{"son":{"son_int":3,"son_str":"i am son"},"father_str":"i am father"}`)
	father := &Father{}
	err := json.Unmarshal(initStr, father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(father)
	newStr, err := json.Marshal(father)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(newStr))
}

type Father struct {
	Son	`json:"son"`
	FatherStr	string `json:"Father_str"`
}

type Son struct {
	SonStr	string 		`json:"son_str"`
	SonStrInt	int		`json:"son_int"`
}
&{{i am son 3} i am father}
{"son":{"son_str":"i am son","son_int":3},"Father_str":"i am father"}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值