前面我们介绍了 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. django -- ORM实现出版社增删改查

    前戏 我们来完成一个图书管理系统的增删改查 表结构设计 1. 出版社 id   name 2. 作者 id  name 3. 书 id  title  出版社_id 4. 作者_书_关系表 id  书 ...

  2. 洛谷p1559运动员最佳匹配问题

    题目 搜索 可行性剪枝 虽然这题目是我搜二分图的标签搜到的 但是n比较小 明显可以暴力 然而只有80分 再加上可行性剪纸就行啦 就是记所有运动员他所能匹配到的最大值. 在我们搜索到第i层的时候 如果他 ...

  3. css规范思维导图(仅限于自己)

  4. Makefile之编译运行连接库方法

    LIBS+= -L $$PWD/../HKUnifyCamera_one/Debug -lHKUnifyCamera -luuid -Wl,-rpath=$$PWD/../HKUnifyCamera_ ...

  5. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...

  6. CF852A Digits

    CF852A Digits 隔壁yijian大佬写出了正解.那我就写一个随机化大法吧? 我们先考虑一种错误的贪心,每个数字分成一位,使其分割后数字和最小.虽然这样是错的,但是我们发现错误的概率很小,所 ...

  7. c++功能与方法笔记

    1. windows判断创建目录 #include <Shlwapi.h> #pragma comment(lib, "shlwapi.lib") //windows ...

  8. 实现简单的AOP前置后置增强

    AOP操作是我们日常开发经常使用到的操作,例如都会用到的spring事务管理.今天我们通过一个demo实现对一个类的某一个方法进行前置和后置的增强. //被增强类 public class PetSt ...

  9. mke2fs和mkfs命令使用

    1.mke2fs命令 在Linux系统下,mke2fs命令可用于创建磁盘分区上的”ext2/ext3”文件系统. (1)语法 mke2fs(选项)(参数) (2)常用选项 -b<区块大小> ...

  10. [转帖]spring基本概念精炼

    spring基本概念精炼 https://www.jianshu.com/p/3c30279d58cd jdk8.0 以及 spring5.0 之后已经使用java的注解方式 不需要使用xml配置文件 ...