结构体标签在json中的应用----json编解码

174 阅读1分钟

 首先定义一个结构体,并给每个属性赋予 json 标签,(Json是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。)代码如下:

type Movie struct {
	Title  string   `json:"title"` //想换成json
	Year   int      `json:"year"`
	Price  int      `json:"rmb"`
	Actors []string `json:"actors"` //演员切片
}

接下来我们来一起看一下编码的过程,通过使用 json.Marshal () 方法,将数据编码成json字符串代码如下:

movie := Movie{"新剧之王", 2000, 199, []string{"xingye", "yjy"}}
	//编码的过程   结构体------>json
	jsonStr, err := json.Marshal(movie)
	if err != nil {
		fmt.Println("json marshal error", err)
		return
	}
	fmt.Printf("jsonStr=%s\n", jsonStr)
	fmt.Println(err) //<nil>

要注意:

  • 可导出的成员属性的首字母是大写的,才可以转成 json 。
  • 如果属性有 json 标签,那么转化成的 json key 就用该标签里的值,否则取属性名来作为 key
  •  bool类型也是可以直接转换为json的value值。循环的数据结构(导致marshal陷入死循环) 、Channel, complex 以及函数不能被编码json字符串。
  •  json 编译之后就是字符串
  • 切片在编码时自动转换为它所指向的值

 那就再来看一下解码的过程吧。通过使用 json.Unmarshal() 方法将json字符串解码到相应的数据结构。代码如下:

//解码的过程  jsonstr------->结果体
	//jsonStr={"title":"新剧之王","year":2000,"rmb":199,"actors":["xingye","yjy"]}
	//首先定义一个结构体
	myMovie := Movie{}
	json.Unmarshal(jsonStr, &myMovie)
	if err != nil {
		fmt.Println("json marshal error", err)
		return
	}
	fmt.Printf("%v\n", myMovie)//{新剧之王 2000 199 [xingye yjy]}

要注意:

  • json字符串解析时,需要一个“接收体”接受解析后的数据,且Unmarshal时接收体必须传递指针。否则解析虽不报错,但数据无法赋值到接受体(Movie{} )中。
  • 解析时,接收体可自行定义。

完整代码如下:

package main

import (
	"encoding/json"
	"fmt"
)

type Movie struct {
	Title  string   `json:"title"` //想换成json
	Year   int      `json:"year"`
	Price  int      `json:"rmb"`
	Actors []string `json:"actors"` //演员切片
}

func main() {
	movie := Movie{"新剧之王", 2000, 199, []string{"xingye", "yjy"}}
	//编码的过程   结构体------>json
	jsonStr, err := json.Marshal(movie)
	if err != nil {
		fmt.Println("json marshal error", err)
		return
	}
	fmt.Printf("jsonStr=%s\n", jsonStr)
	fmt.Println(err) //<nil>
	//解码的过程  jsonstr------->结果体
	//jsonStr={"title":"新剧之王","year":2000,"rmb":199,"actors":["xingye","yjy"]}
	//首先定义一个结构体
	myMovie := Movie{}
	json.Unmarshal(jsonStr, &myMovie)
	if err != nil {
		fmt.Println("json marshal error", err)
		return
	}
	fmt.Printf("%v\n", myMovie)//{新剧之王 2000 199 [xingye yjy]}
}