在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7.  
  8. //在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。`TAB键左上角的按键,~线同一个键盘`
  9.  
  10. type Student struct {
  11. StudentId string `json:"sid"`
  12. StudentName string `json:"sname"`
  13. StudentClass string `json:"class"`
  14. StudentTeacher string `json:"teacher"`
  15. }
  16.  
  17. type StudentNoJson struct {
  18. StudentId string
  19. StudentName string
  20. StudentClass string
  21. StudentTeacher string
  22. }
  23.  
  24. //可以选择的控制字段有三种:
  25. // -:不要解析这个字段
  26. // omitempty:当字段为空(默认值)时,不要解析这个字段。比如 false、0、nil、长度为 0 的 array,map,slice,string
  27. // FieldName:当解析 json 的时候,使用这个名字
  28. type StudentWithOption struct {
  29. StudentId string //默认使用原定义中的值
  30. StudentName string `json:"sname"` // 解析(encode/decode) 的时候,使用 `sname`,而不是 `Field`
  31. StudentClass string `json:"class,omitempty"` // 解析的时候使用 `class`,如果struct 中这个值为空,就忽略它
  32. StudentTeacher string `json:"-"` // 解析的时候忽略该字段。默认情况下会解析这个字段,因为它是大写字母开头的
  33. }
  34.  
  35. func main() {
  36. //NO.1 with json struct tag
  37. s := &Student{StudentId: "", StudentName: "fengxm", StudentClass: "", StudentTeacher: "feng"}
  38. jsonString, _ := json.Marshal(s)
  39.  
  40. fmt.Println(string(jsonString))
  41. //{"sid":"1","sname":"fengxm","class":"0903","teacher":"feng"}
  42. newStudent := new(Student)
  43. json.Unmarshal(jsonString, newStudent)
  44. fmt.Println(newStudent)
  45. //&{1 fengxm 0903 feng}
  46. //Unmarshal 是怎么找到结构体中对应的值呢?比如给定一个 JSON key Filed,它是这样查找的:
  47. // 首先查找 tag 名字(关于 JSON tag 的解释参看下一节)为 Field 的字段
  48. // 然后查找名字为 Field 的字段
  49. // 最后再找名字为 FiElD 等大小写不敏感的匹配字段。
  50. // 如果都没有找到,就直接忽略这个 key,也不会报错。这对于要从众多数据中只选择部分来使用非常方便。
  51.  
  52. //NO.2 without json struct tag
  53. so := &StudentNoJson{StudentId: "", StudentName: "fengxm", StudentClass: "", StudentTeacher: "feng"}
  54. jsonStringO, _ := json.Marshal(so)
  55.  
  56. fmt.Println(string(jsonStringO))
  57. //{"StudentId":"1","StudentName":"fengxm","StudentClass":"0903","StudentTeacher":"feng"}
  58.  
  59. //NO.3 StudentWithOption
  60. studentWO := new(StudentWithOption)
  61. js, _ := json.Marshal(studentWO)
  62.  
  63. fmt.Println(string(js))
  64. //{"StudentId":"","sname":""}
  65.  
  66. studentWO2 := &StudentWithOption{StudentId: "", StudentName: "fengxm", StudentClass: "", StudentTeacher: "feng"}
  67. js2, _ := json.Marshal(studentWO2)
  68.  
  69. fmt.Println(string(js2))
  70. //{"StudentId":"1","sname":"fengxm","class":"0903"}
  71.  
  72. }

参考:

GO语言JSON简介

golang struct 定义中json``解析说明的更多相关文章

  1. golang的xml、json解析

    xml golang的xml处理主要应用Unmarshal.Marshal方法实现,解析一个xml到struct如下,首先是xml文件: <?xml version="1.0" ...

  2. IOS中Json解析的四种方法

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...

  3. Flutter 中 JSON 解析

    本文介绍一下Flutter中如何进行json数据的解析.在移动端开发中,请求服务端返回json数据并解析是一个很常见的使用场景.Android原生开发中,有GsonFormat这样的神器,一键生成Ja ...

  4. Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比

    介绍 移动互联网产品与服务器端通信的数据格式,如果没有特殊的需求的话,一般选择使用JSON格式,Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高 ...

  5. 【转】IOS中Json解析的四种方法

    原文网址:http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有 ...

  6. Java中Json解析

    首先准备一个JSON格式的字符串 * String JsonStr = "{object:{persons:" + "[{name:'呵呵',image:'http:// ...

  7. iOS 中json解析数据出现中文乱码的问题

    一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢 ...

  8. iOS中JSON解析三方库的比较

    网络数据解析框架 1.  JsonModel 一个 JSON 模型转换库,有着比较简洁的接口.Model 需要继承自 JSONModel. 2.  yyModel yyModel比较轻量(算上.h 只 ...

  9. ios中json解析出现的null问题

    http://my.oschina.net/iq19900204/blog/408034 在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式. 问题现象 但是几个 ...

随机推荐

  1. Android TextView 阴影效果(投影)

    Android TextView 阴影效果(投影) 四个参数: 1 2 3 4 android:shadowColor="@color/white" android:shadowD ...

  2. Ubuntu 16.04安装Chrome浏览器时提示:N: 忽略‘google-chrome.list.1’(于目录‘/etc/apt/sources.list.d/’),鉴于它的文件扩展名无效

    使用终端安装谷歌浏览器时,它会自动在/etc/apt/sources.list.d/这个目录下添加google-chrome.list文件,但是如果它原来就有一个google-chrome.list的 ...

  3. java中终止线程的三种方式

    在java中有三种方式可以终止线程.分别为: 1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止.  2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和sus ...

  4. 设计模式之工厂模式之工厂方法(php实现)

    github: git@github.com:ZQCard/design_pattern.git /** * 工厂方法 * 使用开闭原则来分析下工厂方法模式.当有新的产品产生时,只要按照抽象产品角色. ...

  5. 关联模型中如果condition条件

    在练习中,有一个user表和地址表,一对多的关系. 我的想法是,通过这个关联模型找出这个用户下面默认值字段为1的地址 控制器中 public function index(){ $User = D(' ...

  6. selenium清空元素时,.clear不执行

    应该是由于鼠标焦点没有定位到相应元素 driver.find_element_by_xpath('//input[@type="password"]').click() drive ...

  7. SilverLight-3:目录

    ylbtech-SilverLight-Index: 1.A,返回顶部 Layout The Layout Containers - The Panel Background Borders   Si ...

  8. ios开发 Socket通信

    Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...

  9. iptables利用connlimit模块限制同一IP连接数

    connlimit功能: connlimit模块允许你限制每个客户端IP的并发连接数,即每个IP同时连接到一个服务器个数. connlimit模块主要可以限制内网用户的网络使用,对服务器而言则可以限制 ...

  10. depth linear

    float ConvertDepth( float depthFromTex, float4 cameraParams ){ const float near = cameraParams.z; co ...