前面我们介绍了 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数据之三的更多相关文章

  1. Golang: 解析JSON数据之二

    上次我们介绍了 Go 语言中序列化和反序列化 JSON 数据的两个方法 Marshal() 和 Unmarshal(),并以示例演示了它们的用法. 我们在例子中看到,需要事先声明好对应的结构体,才能跟 ...

  2. Golang: 解析JSON数据之一

    JSON 作为目前最流行的数据传输格式, 相信每个程序员都跟它打过交道吧.使用 Go 语言时,也不可避免的要操作 JSON 数据,令人惊喜的是,Go 内置了序列化和反序列化 JSON 的功能,今天就来 ...

  3. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  4. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  5. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  6. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  7. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  8. fastjson生成和解析json数据,序列化和反序列化数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

  9. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

随机推荐

  1. Spring---SSH整合(二)

    基于Spring---SSH整合,使用SSH编写后台: User模块层 TreeNode.hbm.xml <?xml version="1.0" encoding=" ...

  2. JOI2013-2019

    代码自己去LOJ看 JOI2013 彩灯 把序列划分成若干极长交替列,那么最优的方案一定是将一个极长交替列翻转使得连续的三个极长交替列合成一个.计算相邻三个极长交替列长度的最大值即可. 搭乘IOI火车 ...

  3. nuxtjs如何部署cdn及区分发布环境

    1.部署cdn nuxt  build 后的前端资源都会存放在.nuxt/dist/ 文件夹下面 img 目录存放的是使用到的图片资源,无论是开发中存放在 assets 文件夹里的,还是static里 ...

  4. shell 字符串拼接

    #!/bin/bash name="Shell" url="http://c.biancheng.net/shell/" str1=$name$url #中间不 ...

  5. 第10组 Beta冲刺(1/4)

    队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 继续学习Android studio和Java 制作剩余界面前端 展示GitHub当日代码/文档签入记录 ...

  6. vue+element 表格筛选

      筛选是element 组件 自己有的东西,按照文档撸 是没有问题 这里存在一个情况是,如果 筛选 的数据没有 那么整个表格为空白,产品要加提示 例如:暂无筛选的数据 解决方案:通过 ref 获取整 ...

  7. Elasticsearch SQL用法详解

    Elasticsearch SQL用法详解  mp.weixin.qq.com 本文详细介绍了不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作,并给出了几个具体例子 ...

  8. 【mysql】'XXX.XXX.XXX' isn't in GROUP BY问题解决

    原因是mysql的版本低于5.7,使用的GROUP BY 例如:数据库名称为db,表为t,sql为SELECT id, user_name FROM sys_user GROUP BY id 报错为 ...

  9. SQL Server ----- 还原数据库,将另一台电脑上的数据库装在本机

    1.创建好数据库,记住安装位置,,和需要还原的数据库的位置 还原数据库的意思就是 根据创建的数据库,还原备份的数据库,如果数据库中没有数据库要新建数据库. 2.进来后如图 3.找你需要的还原数据库的位 ...

  10. 自学Dos的随堂笔记

    开启DOS控制台的几种方式 开始+windows系统+命令提示符. Win键+R,输入cmd打开控制台. 在任意文件夹下,按住shift键+鼠标右键点击,在此处打开命令窗口. 资源管理器的地址栏前面加 ...