设为首页 收藏本站
查看: 1233|回复: 0

[经验分享] golang json 编码解码

[复制链接]

尚未签到

发表于 2018-9-20 11:35:58 | 显示全部楼层 |阅读模式
  golang  "encoding/json"包实现了json对象的编解码
  一、编码
  

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

  Marshal函数使用下面的基于类型的默认编码格式:
布尔类型编码为json布尔类型。

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

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

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

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

Example:

  

package main  

  
import(
  
     "fmt"
  
     "encoding/json"
  
)
  
func main() {
  
     type User struct{
  
         Name string
  
         Age int
  
     }
  
     user := User{
  
         Name:"tom",
  
         Age:3,
  
     }
  
     b, err := json.Marshal(user)
  
     if err != nil {
  
         fmt.Println("json Marshal fail:", err)
  
     }
  
     fmt.Println(string(b))
  
}
  

  Output:
  

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

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

type User struct{  Name
string  age
int  }
  user :
= User{  Name:
"tom",  age:
3,  }
  b, _ :
= json.Marshal(user)  fmt.Println(
string(b))  

  Output:
  

{"Name":"tom"}  

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

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

  Output:
  

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

  3 复杂结构体编码:
  指针编码为它指向的值
  切片编码为数组
  结构体的值编码为json对象
  Example:
  

    // 复杂结构体编码//基本类型指针,结构体指针,切片,切片指针,  type Contact struct {
  Addr string
  Phone string
  }
  

  type User struct {
  Name string
  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: {Tom 0xc04204a1c8 0xc042044580 [{北京 11111} {深圳 22222}] [0xc042086000 0xc042086020]}  
json:  {
"Name":"Tom","Age":20,"C1":{"Addr":"北京","Phone":"12345"},"C2":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}],"C3":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}]}  

  二、解码
  

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

  Example
  

//json解码 测试  type Contact struct {
  Addr string
  Phone string
  }
  

  type User struct {
  Name string
  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)
  if err != nil {
  fmt.Println("json Unmarshal fail!")
  }
  fmt.Printf("%v\n", user)
  fmt.Println(*user.Age)
  fmt.Println(*user.C1)
  fmt.Println(*user.C3[0])
  

  Output
  

{Tom 0xc04204a3a8 0xc0420447a0 [{北京 11111} {深圳 22222}] [0xc042044860 0xc042044880]}  

20  
{北京
12345}  
{北京
11111}  

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598820-1-1.html 上篇帖子: Golang fmt包使用小技巧 下篇帖子: golang 简单的http服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表