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

首先定义一个结构体,并给每个属性赋予 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]}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊的饲养员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值