介绍: json 是一种常见的数据交互模式, 从语法来看, 他类似于javascript 的 对象和列表。 通常情况下, json 被用于在web 后端服务器和 运行在浏览器上的js 程序进行通信, 偶尔, 该数据结构也用被其他地方用于通信。 你可以使用json 包在你的 go 程序中非常简单的读写json. 编码: 编码json 数据可以使用 Marshal 函数 func Marshal(v interface{}) ([]byte, error) 下面给出go 数据结构: Message type Message struct { Name string Body string Time int64 } 和 Message 的实例: m m := Message{"Alice", "Hello", 1294706395881547000} 我们能够使用 json.Marshal 方法得到一个m实例的json 字符串([]byte) b, err := json.Marshal(m); 如果我们的语法正确, 则 err 变量的值为 nil, 且b 变量([]byte)中会保存json 数据 b == []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`) ps: go 中使用反引号或两个双引号来表示一个字符串, 两种方法略有分别, 可以搜索 'go 反引号 双引号 的相关博客' 以下是一些合法json 编码的规则 json 对象只支持使用字符串为key; 在编码 map 类型时, map 的形式应该为 map[string]T (T 是json 包中支持的变量类型) 管道类型、 复杂类型、 函数类型不能被编码为json 不支持循环结构, 这样会导致Marshal 函数死循环 json 包仅仅会访问结构体类型的导出字段(结构体成员变量已大写字母开头), 所以, 输出的json 串只会包含结构体的导出字段。 解码: 我们可以使用Unmarshal 函数解码json 数据 func Unmarshal(data []byte, v interface{}) error 我们必须提前创建好保存json 对象的数据结构 var m Message 然后, 调用 json.Unmarshal, 传入含有json 数据的b ([]byte) 和 m (Message)的指针 err := json.Unmarshal(b, &m); 如果 b 中的json 串合法, 则err 变量的值为 nil ; 同时, 会把b 中的数据存储在 m 中 , 这个过程类似于下面的赋值操作: m = Message{ Name: "Alice", Body: "Hello", Time: 1294706395881547000, } 现在, 我们来思考一个问题, Unmarshal 是如何将对应的值存入结构体相应的字段中呢? 举个栗子, Json 中有一个 key -- "Foo", Unmarshal 函数是如何找到结构体中对应的 Foo 成员并赋值的呢? Unmarshal 函数反序列化的规则如下: 找到一个导出字段的 tag 叫 "Foo" 的 找到一个 导出字段叫 "Foo" 的 按照忽略大小写匹配导出字段为 "Foo" 的 (例如 : FOO FoO FOo 都算) 因为涉及到匹配,那么, 如果json 串中的key 没有匹配 go 语言中的类型会怎么样呢? 比如说: b := []byte(`{"Name":''Bob", "Food":"Pickle"}`) var m Message err := json.Unmarshal(b, &m); 在上面的例子中, Unmarshal 函数会尽量将匹配的字段赋值。 也就是说 只有 Name 字段会被复制, Food 字段将会忽略掉。 以上是已知json 数据内容的情况, 这样可以自定义结构体, 如果json 结构体未知呢? 预知后事如何, 请听下回分解
入群交流(该群和以上内容无关):Go中文网 QQ交流群:731990104 或 加微信入微信群:274768166 备注:入群; 公众号:Go语言中文网
以上所述就是小编给大家介绍的《go 和 json ------ 对官方博客的一种翻译》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【RUST官方语言中文翻译】前言
- 【RUST官方语言中文翻译】简介
- PendingIntent 是个啥?官方文档描述的很到位。我给翻译翻译
- Spring Security学习(翻译官方文档)
- 如何参与 Python 官方文档简体中文翻译
- 组复制官方翻译七、Requirements and Limitations
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective Modern C++ 简体中文版
Scott Meyers / 高博 / 中国电力出版社 / 2018-4-23 / 99
想要彻底理解C++11和C++14,不可止步于熟悉它们引入的语言特性(例如,auto型别推导、移动语义、lambda表达式以及并发支持)。挑战在于高效地运用这些特性——从而使你的软件具备正确性、高效率、可维护性和可移植性。这正是这本实用的图书意欲达成的定位。它描述的正是使用C++11和C++14——现代C++来撰写真正卓越的软件之道。 涵盖以下主题: 大括号初始化、noexcept规格......一起来看看 《Effective Modern C++ 简体中文版》 这本书的介绍吧!