话不多说,直接上代码:
/*
* @Descripttion:
* @version:
* @Author: weilin
* @Date: 2019-10-20 10:36:52
* @LastEditors: weilin
* @LastEditTime: 2019-10-20 11:02:09
*/
package main
import (
// json包
/**
json的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式。易于人阅读和编写,
同时易于机器解析和生成。json有两种类型的数据,用go语言来描述这两种类型:
map “名称/值”对,用{}标识
slice 也可以说是数组,用[]标识
{
"Name": "Joe",
"Age": 18,
}
["apple", "banana", "pear"]
golang如何处理json
golang标准库encoding/json是用来处理json数据的,它有两组函数或者方法来处理json数据。
函数名 输入 输出 描述
Marshal v interface{} []byte, error 编码v成json数据 To Json
Unmarshal []byte, v(指针) error 解码json,储存在v中 From Json
Encode v interface{} error 编码v成json数据 输出到 io.Writer
Decode v (指针) error 解码json, 输入来自io.Reader
*/
"encoding/json"
"fmt"
)
// 定义结构体用来接收json数据
type Users struct {
ID string `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
//结构体解析成json
user1 := Users{"1", "user1", 22}
/**
使用json key来标识这个结构体中的field,对应编码后json中key值。
omitempty 如果值是false, 0, 空指针,空接口,空数组,空切片,空映射,空字符串,将被忽略。
“-” 这个field将会被忽略。
使用json.Marshal()函数可以对一组数据进行JSON格式的编码
func Marshal(v interface{}) ([]byte, error)
通过结构体生成json,结构体属性字段名首字母要大写
*/
s, err := json.Marshal(user1)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("struct to json---", string(s))
}
//json解析到结构体
var user2 Users
/**
解码函数: func Unmarshal(data []byte, v interface{}) error
data 是一个JSON数据
v 是存储解码数据的指针
error 返回的错误类型
各类型解码
指针:
null解码成空指针
指针非空,解码成指针指向的数据
指针为空,解码函数为他创建新指针,并且为其填充数据。
接口:
UnmarshalJSON method
UnmarshlText method
结构体:
field(tags)相对应解码
碰到不匹配field,忽略掉(默认行为)
切片:
reset slice length to 0, 添加元素到slice
空的JSON 数组,重新生成一个空slice
数组:
go数组小于JSON数组,多余的将忽略
go数组大于JSON数组,多余填充0值
映射:
映射为nil, 重新生成map,填充数据返回
映射非空,直接填充数据
下面例子是解析到结构体
*/
err = json.Unmarshal(s, &user2)
if err == nil {
fmt.Println("json to stuct---", user2)
}
//map解析成json
/**
将map解析成json格式,如果map vaule值为空,则对应json转换后字段值为""
*/
m := make(map[string]interface{}, 2)
m["id"] = "a"
m["name"] = "bb"
m["addr"] = ""
var data []byte
if data, err = json.Marshal(m); err == nil {
fmt.Println("map to json ----", string(data))
}
//json解析成map
/**
映射:
映射为nil, 重新生成map,填充数据返回
映射非空,直接填充数据如
{"addr":"","id":"a","name":"bb"} to map[addr: id:a name:bb]
*/
if err = json.Unmarshal(data, &m); err == nil {
fmt.Println("json to map ----", m)
}
}
/**
参考链接:
https://segmentfault.com/a/1190000018976752
https://www.cnblogs.com/lemonzwt/p/10024009.html
https://my.oschina.net/qiangmzsx/blog/1503018
*/
有疑问加站长微信联系(非本文作者)