分享
  1. 首页
  2. 文章

Go_Json_Unmarshal_Marshal

u012807459 · · 29686 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go按照RFC 4627的标准实现了一个json编解码的标准库

func Unmarshal(data []byte, v interface{}) error
Unmarshal用于反序列化json的函数 根据data将数据反序列化到传入的对象中

仔细查看代码中的四种情况

1 将json反序列化成struct对象

2 将json反序列化到可以存储struct的slice中

3 将json 反序列化到map中

4 将json反序列化到slice中

package main
import (
	"encoding/json"
	"fmt"
)
func main() {
	type Person struct {
		Name string
		Age int
		Gender bool
	}
	//unmarshal to struct
	var p Person
	var str = `{"Name":"junbin", "Age":21, "Gender":true}`
	json.Unmarshal([]byte(str), &p)
	//result --> junbin : 21 : true
	fmt.Println(p.Name, ":", p.Age, ":", p.Gender)
	// unmarshal to slice-struct
	var ps []Person
	var aJson = `[{"Name":"junbin", "Age":21, "Gender":true},
				{"Name":"junbin", "Age":21, "Gender":true}]`
	json.Unmarshal([]byte(aJson), &ps)
	//result --> [{junbin 21 true} {junbin 21 true}] len is 2
	fmt.Println(ps, "len is", len(ps))
	// unmarshal to map[string]interface{}
	var obj interface{} // var obj map[string]interface{}
	json.Unmarshal([]byte(str), &obj)
	m := obj.(map[string]interface{})
	//result --> junbin : 21 : true
	fmt.Println(m["Name"], ":", m["Age"], ":", m["Gender"])
	//unmarshal to slice
	var strs string = `["Go", "Java", "C", "Php"]`
	var aStr []string
	json.Unmarshal([]byte(strs), &aStr)
	//result --> [Go Java C Php] len is 4
	fmt.Println(aStr, " len is", len(aStr))
}


func Marshal(v interface{}) ([]byte, error)
Marshal 用于将struct对象序列化到json对象中

下面这个例子讲解了以下几个例子

1 给field指定别名

2 序列化时忽略字段

3 序列化时忽略值为zero value的字段

4 序列化时 将int类型的值 转换成string

5 slice序列化为json

6 map序列化为json

package main
import (
	"encoding/json"
	"fmt"
)
//tag中的第一个参数是用来指定别名
//比如Name 指定别名为 username `json:"username"`
//如果不想指定别名但是想指定其他参数用逗号来分隔
//omitempty 指定到一个field时
//如果在赋值时对该属性赋值 或者 对该属性赋值为 zero value
//那么将Person序列化成json时会忽略该字段
//- 指定到一个field时
//无论有没有值将Person序列化成json时都会忽略该字段
//string 指定到一个field时
//比如Person中的Count为int类型 如果没有任何指定在序列化
//到json之后也是int 比如这个样子 "Count":0
//但是如果指定了string之后序列化之后也是string类型的
//那么就是这个样子"Count":"0"
type Person struct {
	Name string `json:"username"`
	Age int
	Gender bool `json:",omitempty"`
	Profile string
	OmitContent string `json:"-"`
	Count int `json:",string"`
}
func main() {
	var p *Person = &Person{
		Name: "brainwu",
		Age: 21,
		Gender: true,
		Profile: "I am Wujunbin",
		OmitContent: "OmitConent",
	}
	if bs, err := json.Marshal(&p); err != nil {
		panic(err)
	} else {
		//result --> {"username":"brainwu","Age":21,"Gender":true,"Profile":"I am Wujunbin","Count":"0"}
		fmt.Println(string(bs))
	}
	var p2 *Person = &Person{
		Name: "brainwu",
		Age: 21,
		Profile: "I am Wujunbin",
		OmitContent: "OmitConent",
	}
	if bs, err := json.Marshal(&p2); err != nil {
		panic(err)
	} else {
		//result --> {"username":"brainwu","Age":21,"Profile":"I am Wujunbin","Count":"0"}
		fmt.Println(string(bs))
	}
	// slice 序列化为json
	var aStr []string = []string{"Go", "Java", "Python", "Android"}
	if bs, err := json.Marshal(aStr); err != nil {
		panic(err)
	} else {
		//result --> ["Go","Java","Python","Android"]
		fmt.Println(string(bs))
	}
	//map 序列化为json
	var m map[string]string = make(map[string]string)
	m["Go"] = "No.1"
	m["Java"] = "No.2"
	m["C"] = "No.3"
	if bs, err := json.Marshal(m); err != nil {
		panic(err)
	} else {
		//result --> {"C":"No.3","Go":"No.1","Java":"No.2"}
		fmt.Println(string(bs))
	}
}

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u012807459

查看原文:Go_Json_Unmarshal_Marshal

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
29686 次点击
被以下专栏收入,发现更多相似内容
2 回复 | 直到 2000年01月01日 00:00:00
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏