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

[经验分享] golang json 处理的一些例子代码

[复制链接]

尚未签到

发表于 2018-9-20 07:16:46 | 显示全部楼层 |阅读模式
  json 处理的例子代码, 解析结果看后面注释。
  package main
  import "encoding/json"
  import "fmt"
  import "os"
  type Response1 struct {
  Page   int
  Fruits []string
  }
  type Response2 struct {
  Page   int      `json:"page"`
  Fruits []string `json:"fruits"`
  }
  type CommonArg struct {
  SessionId int64  `json:",string"`
  Op        string `json:"Op,omitempty"`
  AppId     string `json:"appId,omitempty"`
  Online    bool
  }
  func main() {
  bolB, _ := json.Marshal(true)
  fmt.Println(string(bolB)) // true
  intB, _ := json.Marshal(1)
  fmt.Println(string(intB)) // 1
  fltB, _ := json.Marshal(2.34)
  fmt.Println(string(fltB)) // 2.34
  strB, _ := json.Marshal("gopher")
  fmt.Println(string(strB)) // "gopher"
  slcD := []string{"apple", "peach", "pear"}
  slcB, _ := json.Marshal(slcD)
  fmt.Println(string(slcB)) //  ["apple","peach","pear"]
  mapD := map[string]int{"apple": 5, "lettuce": 7}
  mapB, _ := json.Marshal(mapD)
  fmt.Println(string(mapB)) // {"apple":5,"lettuce":7}
  res1D := &Response1{
  Page:   1,
  Fruits: []string{"apple", "peach", "pear"}}
  res1B, _ := json.Marshal(res1D)
  fmt.Println(string(res1B)) // {"Page":1,"Fruits":["apple","peach","pear"]}
  res2D := &Response2{
  Page:   1,
  Fruits: []string{"apple", "peach", "pear"}}
  res2B, _ := json.Marshal(res2D)
  fmt.Println(string(res2B)) // {"Page":1,"Fruits":["apple","peach","pear"]}
  aaa := &CommonArg{
  SessionId: 12345,
  Op:        "werdfsdde22233",
  AppId:     "654343dfddd33424dd",
  Online:    false,
  }
  aaa1, _ := json.Marshal(aaa)
  fmt.Println(string(aaa1)) // {"SessionId":"12345","Op":"werdfsdde22233","appId":"654343dfddd33424dd","Online":false}
  byt := []byte(`{"num":6.0,"strs":["a","b"]}`)
  var dat map[string]interface{}
  if err := json.Unmarshal(byt, &dat); err != nil {
  panic(err)
  }
  fmt.Println(dat) // map[strs:[a b] num:6]
  num := dat["num"].(float64)
  fmt.Println(num) // 6
  strs := dat["strs"].([]interface{})
  str1 := strs[0].(string)
  fmt.Println(str1) // a
  str := `{"page": 1, "fruits": ["apple", "peach"]}`
  res := &Response2{}
  json.Unmarshal([]byte(str), &res)
  fmt.Println(res)           // &{1 [apple peach]}
  fmt.Println(res.Fruits[0]) // apple
  enc := json.NewEncoder(os.Stdout)
  d := map[string]int{"apple": 5, "lettuce": 7}
  enc.Encode(d) // {"apple":5,"lettuce":7}
  }
  注意,这里 json的 struct field's tag 规范定义如下:
  在Go语言里,StructTag是一个标记字符串,此字符串可跟随在Struct中字段定义的后面。
  StructTag就是一系列的 key:”value” 形式的组合,其中key是一个不可为空的字符串,key-value组合可以有多个,空格分隔。
  StructTag有什么用?!StructTag主要解决了不同类型数据集合间(Struct,Json,Table等)转换中键值Key定义不一样的问题。StructTag可以理解为一个不同数据类型键值Key的映射表Map, 在StructTag中可以定义不同数据集合键值和Struct中Key值的映射关系,这样方便了Struct数据转为其他类型数据的过程。
  在StructTag中加入”omitempty”, 标识该字段的数据可忽略。
- 指定到一个field时,无论有没有值将Person序列化成json时都会忽略该字段  参考下面代码, 代码来自:http://studygolang.com/articles/1698:
  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 ghj1976",
  OmitContent: "OmitConent",
  }
  if bs, err := json.Marshal(&p); err != nil {
  panic(err)
  } else {
  //result --> {"username":"brainwu","Age":21,"Gender":true,"Profile":"I am ghj1976","Count":"0"}
  fmt.Println(string(bs))
  }
  var p2 *Person = &Person{
  Name:        "brainwu",
  Age:         21,
  Profile:     "I am ghj1976",
  OmitContent: "OmitConent",
  }
  if bs, err := json.Marshal(&p2); err != nil {
  panic(err)
  } else {
  //result --> {"username":"brainwu","Age":21,"Profile":"I am ghj1976","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))
  }
  }
  参考:
  GO语言中的StructTag类型
  http://www.wangwei.info/2013/11/golang-struct-tag/


运维网声明 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-597468-1-1.html 上篇帖子: golang os/exec 执行外部命令 下篇帖子: Golang OOP、继承、组合、接口
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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