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数据,将前台传来 ...
 
随机推荐
- django -- ORM实现出版社增删改查
			
前戏 我们来完成一个图书管理系统的增删改查 表结构设计 1. 出版社 id name 2. 作者 id name 3. 书 id title 出版社_id 4. 作者_书_关系表 id 书 ...
 - 洛谷p1559运动员最佳匹配问题
			
题目 搜索 可行性剪枝 虽然这题目是我搜二分图的标签搜到的 但是n比较小 明显可以暴力 然而只有80分 再加上可行性剪纸就行啦 就是记所有运动员他所能匹配到的最大值. 在我们搜索到第i层的时候 如果他 ...
 - css规范思维导图(仅限于自己)
 - Makefile之编译运行连接库方法
			
LIBS+= -L $$PWD/../HKUnifyCamera_one/Debug -lHKUnifyCamera -luuid -Wl,-rpath=$$PWD/../HKUnifyCamera_ ...
 - [Noip2018]填数游戏
			
传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...
 - CF852A Digits
			
CF852A Digits 隔壁yijian大佬写出了正解.那我就写一个随机化大法吧? 我们先考虑一种错误的贪心,每个数字分成一位,使其分割后数字和最小.虽然这样是错的,但是我们发现错误的概率很小,所 ...
 - c++功能与方法笔记
			
1. windows判断创建目录 #include <Shlwapi.h> #pragma comment(lib, "shlwapi.lib") //windows ...
 - 实现简单的AOP前置后置增强
			
AOP操作是我们日常开发经常使用到的操作,例如都会用到的spring事务管理.今天我们通过一个demo实现对一个类的某一个方法进行前置和后置的增强. //被增强类 public class PetSt ...
 - mke2fs和mkfs命令使用
			
1.mke2fs命令 在Linux系统下,mke2fs命令可用于创建磁盘分区上的”ext2/ext3”文件系统. (1)语法 mke2fs(选项)(参数) (2)常用选项 -b<区块大小> ...
 - [转帖]spring基本概念精炼
			
spring基本概念精炼 https://www.jianshu.com/p/3c30279d58cd jdk8.0 以及 spring5.0 之后已经使用java的注解方式 不需要使用xml配置文件 ...