go中的json处理

go中的json处理

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。

1、JSON解析

json解析也叫json反序列化,相关函数为Unmarshal(),关于这个函数我们可以通过查看相关代码得到他的实现方法。

func Unmarshal(data []byte, v interface{}) error

通过进一步查看我们就可以得到json反序列化时候采用的方法了。相关内容在decode.go 文件中,大致流程就是

  • 查找tag含有相关字符的可导出的struct字段(首字母大写)

  • 查找字段名是相关字符的导出字段

  • 查找除了首字母之外其他大小写不敏感的导出字段

JSON的解析包括常见以下两种:

  • 解析到结构体(知道数据格式)
  • 解析到interface(不知道数据格式)

2、JSON生成

json的生成也叫json序列化,相关函数为Marshal通过查看相关代码我也能看到他的实现方法和Unmarshal逻辑类似:

func Marshal(v interface{}) ([]byte, error)

相关函数实现都在encode 函数中。 在json序列化的时候需要注意以下几点:

  • 字段的tag是"-",那么这个字段不会输出到JSON

  • tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中。

  • tag中如果带有"omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中

  • 如果字段类型是bool, string, int, int64等,而tag中带有",string"选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串

  • JSON对象只支持string作为key,所以要编码一个map,那么必须是map[string]T这种类型(T是Go语言中任意的类型)

  • Channel, complex和function是不能被编码成JSON的

  • 嵌套的数据是不能编码的,不然会让JSON编码进入死循环

  • 指针在编码的时候会输出指针指向的内容,而空指针会输出null

3、代码实例

package main

import (
	"encoding/json"
	"fmt"
)

type Server struct {
	ServerAddr string
	ServerName string
	ServerIP   string
}

type Serverslice struct {
	Servers []Server
}

func main() {
	var s Serverslice
	str := `{"servers":[{"ServerAddr":"Shannxi", "serverName":"Shannxi_v","serverIP":"192.168.1.1"},{"ServerAddr": "Guangdong", "serverName":"Guangdong_V","serverIP":"192.168.1.2"},{"ServerAddr": "Beijing", "serverName":"Beijing_V","serverIP":"192.168.1.3"}]}`
	//json解析 反序列化
	json.Unmarshal([]byte(str), &s)
	fmt.Println(s)
	//json生成 序列化
	n, _ := json.Marshal(s)
	fmt.Println(string(n))
}

运行结果,第一行为反序列化的结果,第二行为序列化的结果。
在这里插入图片描述

4、参考链接

Go web

go-simplejson 文档

go-simple 代码

发布了12 篇原创文章 · 获赞 3 · 访问量 6012

猜你喜欢

转载自blog.csdn.net/qq_40185499/article/details/104132043