JSON in Golang(一)|周末学习

本文已参与 周末学习计划,点击查看详情

这是我参与更文挑战的第2天,活动详情查看:更文挑战

常用方法

Marshal 方法介绍

func Marshal(v interface{}) ([]byte, error)
复制代码

该方法会递归遍历v, 一般情况下,该方法会默认地按照如下对应关系去序列化和反序列化数据。

  • boolean —— JSON booleans
  • float point、integer、number —— JSON numbers
  • string —— JSON strings (会被强制编码为UTF-8,所以嵌入在HTML中使用也是安全的。例如”<“会被替换为 “\u003c”,配置了SetEscapeHTML(false)的时候就不替换了。)
  • array、slice —— JSON arrays
  • struct —— JSON objects

结构体的初始化有点特别,下面详细看看。

// myName就是编码后的这个字段的key
Field int `json:"myName"`

// myName依然是key,但是由于有omitempty关键字,所以当字段值为空的时候,会忽略掉这个字段
Field int `json:"myName,omitempty"`

// 值为空时会跳过这个字段,由于没有指定key,会用Field作为key
Field int `json:",omitempty"`

// 这个字段会被忽略掉
Field int `json:"-"`

// 注意和上面不一样哦,这样写的话,字段名是-
Field int `json:"-,"`
复制代码

还有另外一种写法. 字段以 JSON 形式存储在 JSON 编码的字符串中。它仅适用于字符串、浮点、整数或布尔类型的字段。在与 JavaScript 程序通信时,有时会使用这种额外的编码级别.

Int64String int64 `json:",string"`
复制代码
  • map —— JSON objects (需要注意map的key一定是可比较的类型,不过这算是golang的知识)
  • 指针 —— 该指针对应的值
  • channel、function不能被编码。

有一个小问题:JSON可以处理循环数据结构吗?可以看下这个方法的第一句介绍。

写个小例子试一试

type Xiaowu struct {
	Age float32 `json:"aGe"`
	Color string `json:"color,omitempty"`
	character Com `json:"character"`
}

type Com struct {
	Lovely bool `json:"lovely,omitempty"`
	Cute bool `json:"cute,omitempty"`
	Naughty string `json:"-"`
}


func main() {
	miao := Xiaowu{
		Age: 0.5,
		Color: "grey",
		character: Com{
			Lovely: true,
			Naughty: "true",
		},
	}
	lovelyMiao,_ := json.Marshal(miao)
	log.Println("miao :",string(lovelyMiao))
}
复制代码

输出是:

 miao : {"aGe":0.5,"color":"grey"}
复制代码

阿哦,好像不符合预期。
Emm…
你看没打印出来的字段,开头字母是小写的,是不能够被编码的哦。修改后输出为

 miao : {"aGe":0.5,"color":"grey","character":{"lovely":true}}
复制代码

好啦,今天就到这里啦。每天学习一点点也好啊,早点休息:) 明天来看看Unmarshal吧。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享