Golang: 解析JSON数据之三
前面我们介绍了 Marshal 和 Unmarshal 方法,今天再解一下另外两个 API:Encoder 和 Decoder。
Encoder
Encoder 主要负责将结构对象编码成 JSON 数据,我们可以调用 json.NewEncoder(io.Writer) 方法获得一个 Encoder 实例:
// NewEncoder returns a new encoder that writes to w.
func NewEncoder(w io.Writer) *Encoder {
return &Encoder{w: w, escapeHTML: true}
}
io.Writer 是接口类型,包含一个 Write(p []byte) 方法,凡是实现了这个方法的类型实例,都可以作为参数传递进去。
接下来我们直接调用 Encoder 实例的 Encode(interface{}) 方法即可完成编码操作:
func (enc *Encoder) Encode(v interface{}) error {
// ...
}
下面,我们以一个实例来演示这个操作:
package main
import (
"encoding/json"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
// 如果Child字段为nil 编码JSON时可忽略
Child *Person `json:"child,omitempty"`
}
func main() {
person := Person{
Name: "John",
Age: 40,
Child: &Person{
Name: "Jack",
Age: 20,
},
}
// File类型实现了io.Writer接口
file, _ := os.Create("person.json")
// 根据io.Writer创建Encoder 然后调用Encode()方法将对象编码成JSON
json.NewEncoder(file).Encode(&person)
}
上面程序会将结构体对象编码成 JSON 数据,存入 person.json 文件中,程序运行后,会生成下面文件内容:
{"name":"John","age":40,"child":{"name":"Jack","age":20}}
Decoder
Decoder 主要负责将 JSON 数据解析成结构对象,我们可以调用 json.NewDecoder(io.Reader) 方法获得一个 Decoder 实例:
// NewDecoder returns a new decoder that reads from r.
func NewDecoder(r io.Reader) *Decoder {
return &Decoder{r: r}
}
同样地,io.Reader 也是接口类型,包含一个 Read(p []byte) 方法,凡是实现了这个方法的类型实例,都可以作为参数传递进去。
获取到 Decoder 实例之后,我们直接调用它的 Decode(interface{}) 方法即可完成解析操作:
下面我们写一段程序,读取 person.json 文件,将文件中的 JOSN 内容解析为对象类型:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
// 如果Child字段为nil 编码JSON时可忽略
Child *Person `json:"child,omitempty"`
}
func main() {
var person Person
// File类型也实现了io.Reader接口
file, _ := os.Open("person.json")
// 根据io.Reader创建Decoder 然后调用Decode()方法将JSON解析成对象
json.NewDecoder(file).Decode(&person)
fmt.Println(person)
fmt.Println(*person.Child)
}
运行上面程序,控制台打印如下:
{John 40 0xc42000a080}
{Jack 20 <nil>}
Golang: 解析JSON数据之三的更多相关文章
- Golang: 解析JSON数据之二
上次我们介绍了 Go 语言中序列化和反序列化 JSON 数据的两个方法 Marshal() 和 Unmarshal(),并以示例演示了它们的用法. 我们在例子中看到,需要事先声明好对应的结构体,才能跟 ...
- Golang: 解析JSON数据之一
JSON 作为目前最流行的数据传输格式, 相信每个程序员都跟它打过交道吧.使用 Go 语言时,也不可避免的要操作 JSON 数据,令人惊喜的是,Go 内置了序列化和反序列化 JSON 的功能,今天就来 ...
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- 使用jQuery解析JSON数据
我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
随机推荐
- BILIBILI之滑块验证
bilibili的滑动验证码图片比较好玩,和前一篇不大一样. 采用canvas方法,分析发现只找到一个图片,不过,可以通过设置display截图方式获得2张图(完整图片,带缺口的图片),取得图片后接下 ...
- GoogleHacking语法篇
常用GoogleHacking语法: 1.intext:(仅针对Google有效) 把网页中的正文内容中的某个字符作为搜索的条件 2.intitle: 把网页标题中的某个字符作为搜索的条件 3.cac ...
- 我是sb
哪能倒在这? 细节很多的题怎么写????sb 考完再也不学了,太jb痛苦了. 总因为一些奇奇怪怪的原因导致我
- python3.5以上版本,typing模块提高代码健壮性
一 前言 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数, ...
- OpenSSL创建证书
使用OpenSSL创建证书.采用的OS为CentOS7. 1. 修改OpenSSL的配置文件 vim /etc/pki/tls/openssl.cnf [ CA_default ] dir = /et ...
- Keras 使用过程问题汇总
以下是Keras 使用过程出现的一些问题: (1)Keras 后端选择问题 一开始是选用的Theano,结果迭代一轮所花时间很长: 后面改用:TensorFlow作为后端,结果果然变快了: 改完Ten ...
- ReentrantLock 的公平锁源码分析
ReentrantLock 源码分析 以公平锁源码解析为例: 1:数据结构: 维护Sync 对象的引用: private final Sync sync; Sync对象继承 AQS, Syn ...
- Range Sum Query - Mutable 精简无递归线段树
操作: 单点更新,区间求和 区间求和:如sum [3,10) 需要对19,5,12,26节点求和即可. 观察可知,左端点为右子节点(奇数)时直接相加,右端点为左子节点(偶数)时直接相加,两边向中间移动 ...
- 【题解】物流运输 [ZJ2006] [P1772] [BZOJ1003]
[题解]物流运输 [ZJ2006] [P1772] [BZOJ1003] 传送门:物流运输 \([ZJ2006]\) \([P1772]\) \([BZOJ1003]\) [题目描述] 给定一个含 \ ...
- Spring Boot 整合 MyBatis 实现乐观锁和悲观锁
本文以转账操作为例,实现并测试乐观锁和悲观锁. 完整代码:https://github.com/imcloudfloating/Lock_Demo GitHub Page:http://blog.cl ...