Go JSON

如今在网络编程中JSON这种数据格式占据了较大的市场,如果不出意外,几乎新开发的数据交互,都会使用JSON这种轻量级的数据格式来处理数据交互。所以,怎么解析,转换JSON,成了大多数语言的一种标准模块。今天,我想给大家分享的是Go语言里的标准库"encoding/json"。

转换对应表:

  • bool类型 转换成JSON中的boolean
  • 整型,浮点型转换成JSON中的Number
  • 字符串转换成JSON中的字符串(""而不是'')
  • 结构体转换成JSON中的Object
  • []byte 会先base64然后转换成JSON中的字符串(""而不是'')
  • map 转换成JSON中的Object
  • interface{} 会按内部的类型进行实际转换
  • nil 会转换成JSON中的Null

encodeing/json几乎常用的就两个方法:

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

顾名思义“Marshal”将Go对象进行转换成JSON,而"Unmarshal"则是将JSON转换成Go对象。

不过在转换的过程中,如果我们定义的是结构体,跟Map会有一些不同,以下几点是要注意的:

  • 结构体的成员必须是大写开头
  • 使用Marshal时会按结构体成员的变量名做为Key
  • Unmarshal时会自动匹配结构体成员,大小写不敏感,如果JSON中有多余字段,会直接抛弃,如果缺少某个字段,则会忽略对结构体成员赋值

根据这些规则来说,如果在使用时稍微不注意,可能会有意想不到的错误,举个例子,有一个请求,需要传入参数{"name":"", "age":""},我们定义一个struct结构如下:

type Request struct{   
    Name string
   Age string
}

在进行Marshal会用结构体的成员变量名做为Key,于是我们会得到{"Name":"","Age":""} ,这和请求需要的参数是不同的,所以我们还需要使用到structTag,为了对应关系可以一一对应上,我们需要手动的为结构体打上Tag,才能转换到正确的JSON。

type Request struct{   
    Name string  `json:"name"`
   Age string  `json:"age"`
}

这种情况,几乎是要给对方传递参数时才用到,多数情况下,如果是Unmarshal,因为大小写不敏感,所以不需要structTag,但是,如果JSON的key是比如"f_name",这种,那么,依然需要structTag

type Request struct{   
    Name string  `json:"f_name"`
   Age string  `json:"age"`
}

structTag还有一些其他有用的属性,比如:

  • omitempty 如果JSON字段为空则忽略
  • - 直接忽略

有时候你想更灵活的使用JSON,这个时候就要用到json.RawMessage,多数情况下,我们不会使用到它。加上在JSON中,有一个字段的格式是未知的,比如可能是string,也可能是int,那么这个时候就要用到*json.RawMessage了。


本文分享自微信公众号 - 子曰五溪(fed-talk)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 谈谈 Flutter 中的请求和异步

    如果你了解过 JavaScript 的线程模型,那么就会明白当你遇到有延迟的运算时(请求),它的运行过程都是异步的,只有这样你的 Web 应用UI才不会出现明显...

    icepy
  • 早读《Const Assertions in Literal Expressions in TypeScript》

    https://mariusschulz.com/blog/const-assertions-in-literal-expressions-in-typescr...

    icepy
  • Chrome Extension 通信机制

    那么通信机制为什么要存在?那是因为有时候我们的逻辑可能会写在background中,假设你有一个popup的界面,在background中的处理逻辑,可以将处理...

    icepy
  • 9 款你不能错过的 JSON 工具

    JSON 吸引了工具构建者的注意,它们开发了用于重新格式化、验证和解析 JSON 的众多工具,这不足为奇。这些工具既有在 Web 浏览器中运行的在线实用程序,又...

    GitHubDaily
  • JS高级测试: 下列JSON说法不正确的是?

    使用 JavaScript 内置函数 JSON.parse() 将字符串转换为 JavaScript 对象:

    舒克
  • Qt之JSON教程-介绍篇

    Qt君
  • MySQL 5.7 JSON 实现简介

    本文主要介绍了MySQL在5.7.7之后引入的原生JSON支持的特性,说明了引入JSON类型的好处,并结合具体的示例介绍了MySQL在JSON类型上对外的接口以...

    腾讯云数据库团队
  • JSON对象

    星辉
  • PHP json_encode 的使用方法

    今天在进行接口加签的时候,发现一个问题,数据一直加签失败; 再查找一番原因后发现原来 json_encode 对反斜杠进行了转义,导致数据一直加签失败 解决办法...

    hedeqiang
  • 9 款你不能错过的 JSON 工具

    JSON 吸引了工具构建者的注意,它们开发了用于重新格式化、验证和解析 JSON 的众多工具,这不足为奇。这些工具既有在 Web 浏览器中运行的在线实用程序,又...

    用户6543014

扫码关注云+社区

领取腾讯云代金券