首页 文章资讯内容详情

golang json 编码解码

2026-06-01 4 花语

本文内容纲要:

golang"encoding/json"包实现了json对象的编解码

一、编码

funcMarshal(vinterface{})([]byte,error)

Marshal函数使用下面的基于类型的默认编码格式:

布尔类型编码为json布尔类型。

浮点数、整数和Number类型的值编码为json数字类型。

字符串编码为json字符串。角括号"<"和">"会转义为"\u003c"和"\u003e"以避免某些浏览器吧json输出错误理解为HTML。基于同样的原因,"&"转义为"\u0026"。

数组和切片类型的值编码为json数组,但[]byte编码为base64编码字符串,nil切片编码为null。

结构体的值编码为json对象。每一个导出字段变成该对象的一个成员

Example:

1packagemain 2 3import( 4"fmt" 5"encoding/json" 6) 7funcmain(){ 8typeUserstruct{ 9Namestring 10Ageint 11} 12user:=User{ 13Name:"tom", 14Age:3, 15} 16b,err:=json.Marshal(user) 17iferr!=nil{ 18fmt.Println("jsonMarshalfail:",err) 19} 20fmt.Println(string(b)) 21}

Output:

{"Name":"tom","Age":3}

1不可导出字段,不会被编码

Example:

typeUserstruct{ Namestring ageint } user:=User{ Name:"tom", age:3, } b,_:=json.Marshal(user) fmt.Println(string(b))

Output:

{"Name":"tom"}

2可通过结构体标签,改变编码的json对象

Example:

typeUserstruct{ Namestring`json:"name"` Ageint`json:"ageeeeeeeeeeeeeeeeee"` } user:=User{ Name:"tom", Age:3, } b,_:=json.Marshal(user) fmt.Println(string(b))

Output:

{"name":"tom","ageeeeeeeeeeeeeeeeee":3}

3复杂结构体编码:

指针编码为它指向的值

切片编码为数组

结构体的值编码为json对象

Example:

//复杂结构体编码 //基本类型指针,结构体指针,切片,切片指针, typeContactstruct{ Addrstring Phonestring } typeUserstruct{ Namestring Age*int C1*Contact C2[]Contact C3[]*Contact } age:=20 c1:=Contact{"北京","12345"} cArr:=[...]Contact{Contact{"北京","11111"},Contact{"深圳","22222"},Contact{"上海","33333"}} c2:=cArr[:2] c3:=make([]*Contact,0) c3=append(c3,&cArr[0]) c3=append(c3,&cArr[1]) user:=User{ Name:"Tom", Age:&age, C1:&c1, C2:c2, C3:c3, } fmt.Printf("struct:%v\n",user) b,_:=json.Marshal(user) fmt.Println("json:",string(b))

Output:

struct:{Tom0xc04204a1c80xc042044580[{北京11111}{深圳22222}][0xc0420860000xc042086020]} json: {"Name":"Tom","Age":20,"C1":{"Addr":"北京","Phone":"12345"},"C2":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}],"C3":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}]}

二、解码

funcUnmarshal(data[]byte,vinterface{})error

Example

//json解码测试 typeContactstruct{ Addrstring Phonestring } typeUserstruct{ Namestring Age*int C1*Contact C2[]Contact C3[]*Contact } user:=User{} j:=`{ "Name":"Tom", "Age":20, "C1":{ "Addr":"北京", "Phone":"12345" }, "C2":[{ "Addr":"北京", "Phone":"11111" },{ "Addr":"深圳", "Phone":"22222" }], "C3":[{ "Addr":"北京", "Phone":"11111" },{ "Addr":"深圳", "Phone":"22222" }] }` err:=json.Unmarshal([]byte(j),&user) iferr!=nil{ fmt.Println("jsonUnmarshalfail!") } fmt.Printf("%v\n",user) fmt.Println(*user.Age) fmt.Println(*user.C1) fmt.Println(*user.C3[0])

Output

{Tom0xc04204a3a80xc0420447a0[{北京11111}{深圳22222}][0xc0420448600xc042044880]} 20 {北京12345} {北京11111}

参考:Go语言标准库文档中文版

本文内容总结:

原文链接:https://www.cnblogs.com/fhb2011/p/8975184.html