go 结构体转换为json

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Movie struct {
	Title  string
	Year   int  `json:"released"`
	Color  bool `json:"color,omitempty"`
	Actors []string
}

var movies = []Movie{
	{Title: "Casablanca", Year: 1942, Color: false, Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
	{Title: "Cool Hand Luke", Year: 1967, Color: true, Actors: []string{"Paul Newman"}},
	{Title: "Bullitt", Year: 1968, Color: true, Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
}

func main() {
	/*编码*/
	data, err := json.MarshalIndent(movies, "", "   ")
	if err != nil {
		log.Fatalf("Json marshaling faild: %s", err)
	}

	fmt.Printf("%s\n", data)

	/*解码*/
	var titles []struct{ Title string }
	if err := json.Unmarshal(data, &titles); err != nil {
		log.Fatalf("Json unmarshaling failed: %s", err)
	}
	fmt.Println(titles)

}



执行结果:
/*编码结果*/
[
   {
      "Title": "Casablanca",
      "released": 1942,
      "Actors": [
         "Humphrey Bogart",
         "Ingrid Bergman"
      ]
   },
   {
      "Title": "Cool Hand Luke",
      "released": 1967,
      "color": true,
      "Actors": [
         "Paul Newman"
      ]
   },
   {
      "Title": "Bullitt",
      "released": 1968,
      "color": true,
      "Actors": [
         "Steve McQueen",
         "Jacqueline Bisset"
      ]
   }
]

/*解码结果*/
[{Casablanca} {Cool Hand Luke} {Bullitt}]


其中Year名字的成员在编码后变成了releasedr,还有Color成员 编码后变成了小写字母开头的color。这是因为构体成员Tag所导致的。一个构体成员Tag是和 在编译阶段关联到该成员的元信息字符串。结构体的成员Tag可以是任意的字符串面值,但是通常是一系列用空格分隔的key:"value"键值 对序列;因为值中含义双引号字符,因此成员Tag一般用原生字符串面值的形式书写。json开 头键名对应的值用于控制encoding/json包的编码和解码的行为,并且encoding/...下面其它的 包也遵循这个约定。成员Tag中json对应值的第一部分用于指定JSON对象的名字,比如将Go语言中的TotalCount成员对应到JSON中的total_count对象。Color成员的Tag还带了一个额外 的omitempty选项,表示当Go语言结构体成员为空或零值时不生成JSON对象(这里false为零 值)。果然,Casablanca是一个黑白电影,并没有输出Color成员。
编码的逆操作是解码,对应将JSON数据解码为Go语言的数据结构,Go语言中一般叫 unmarshaling,通过json.Unmarshal函数完成。下面的代码将JSON格式的电影数据解码为一 个结构体slice,结构体中只有Title成员。通过定义合适的Go语言数据结构,我们可以选择性 地解码JSON中感兴趣的成员。当Unmarshal函数调用返回,slice将被只含有Title信息值填 充,其它JSON成员将被忽略。

将类似上面Movie这种结构体slice转换为json的过程叫编组(marshaling),json.MarshalIndent函数将产生整齐缩进的输出。该函数有两个额外的字符串参数用于表

示每一行输出的前缀和每一个层级的缩进
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值