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

序列化是将结构对象转为 JSON 字符串,反序列化是将 JSON 字符串转为结构对象,它们分别对应 encoding/json 包下面的两个方法:

// 序列化 接收interface{}参数 返回字节切片
func Marshal(v interface{}) ([]byte, error) { } // 反序列化 接收字节切片和interface{}参数 将结果反映在interface{}结构上
func Unmarshal(data []byte, v interface{}) error { }

marshal 这个单词的含义是 整理、编排、排列,对应的操作是将结构对象编排成 JSON 字符串,反之,unmarshal 是它的逆操作。

我们通过一个例子来演示这两个方法。假如我们有如下 data.json 文件:

{
"group": "programmer",
"persons": [
{
"name": "Jack",
"age": 25
},
{
"name": "Lily",
"age": 20
}
]
}

接下来,我们要读取这个文件,将 JSON 内容转为结构对象,然后更改对象数据:

// 读取JSON文件 将内容转为结构对象 然后更改数据

package main

import (
"encoding/json"
"fmt"
"io/ioutil"
) type (
person struct {
Name string `json:"name"`
Age int `json:"age"`
} result struct {
Group string `json:"group"`
Persons []person `json:"persons"`
}
) func main() {
var data result // 读取JSON文件内容 返回字节切片
bytes, _ := ioutil.ReadFile("data.json") fmt.Println("*** data.json content: ***") // 打印时需要转为字符串
fmt.Println(string(bytes)) // 将字节切片映射到指定结构上
json.Unmarshal(bytes, &data) fmt.Println("*** unmarshal result: ***") // 打印对象结构
fmt.Println(data) // 更改数据
data.Group = "engineer" // 将更改后的结构对象序列化成JSON格式
newBytes, _ := json.Marshal(&data) fmt.Println("*** update content: ***") // 打印JSON结果
fmt.Println(string(newBytes))
}

上面代码中,结构体字段的后面都有一串说明性信息,它们被称为标签(Tag),用于将结构体和 JSON 数据映射起来,如果不指定,系统会尝试以大小写无关的方式去匹配,但为了便于阅读和避免不必要的匹配过程,我们这里手动指定了具体的字段。

我们运行该程序,控制台会打印如下信息:

{
"group": "programmer",
"persons": [
{
"name": "Jack",
"age": 25
},
{
"name": "Lily",
"age": 20
}
]
}
*** unmarshal result: ***
{programmer [{Jack 25} {Lily 20}]}
*** update content: ***
{"group":"engineer","persons":[{"name":"Jack","age":25},{"name":"Lily","age":20}]}

最后的 JSON 数据还可以在格式化一下,我们可以利用下面这个方法:

// 带格式化的反序列化方法
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { }

相比 Marshal() 方法,MarshalIndent() 多了两个参数,分别是前缀和缩进,都是字符串类型。前缀一般不怎么常用,缩进可指定若干个空格,下面我们来改造一下:

// 将更改后的结构对象序列化成JSON格式
newBytes, _ := json.MarshalIndent(&data, "", " ") fmt.Println("*** indent content: ***") // 打印JSON结果
fmt.Println(string(newBytes))

再次运行程序,打印结果如下:

*** indent content: ***
{
"group": "engineer",
"persons": [
{
"name": "Jack",
"age": 25
},
{
"name": "Lily",
"age": 20
}
]
}

最后,如果希望将结果写回到配置文件中的话,可以添加下面这一行代码:

ioutil.WriteFile("data.json", newBytes, os.ModeAppend)

WriteFile() 方法需要三个参数:文件名、字节切片数据、指定的文件操作权限。如果文件存在,这个方法先会清空文件内容,然后再写入新数据,如果文件不存在,则根据指定的第三个参数,去先创建指定的文件。

执行完上面这行代码,再去查看之前的 data.json 文件,就会发现,配置内容已经更新了。

Golang: 解析JSON数据之一的更多相关文章

  1. Golang: 解析JSON数据之三

    前面我们介绍了 Marshal 和 Unmarshal 方法,今天再解一下另外两个 API:Encoder 和 Decoder. Encoder Encoder 主要负责将结构对象编码成 JSON 数 ...

  2. Golang: 解析JSON数据之二

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

  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. Layui Iframe页面间 方法的相互调用

    就是普通的iframe之间方法的调用,只是注意一下src就像 var childWindow = $(window.parent.document).find("iframe[src='/A ...

  2. 洛谷P1230智力大冲浪 题解

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  3. 用luks方式对磁盘进行加密以及加密磁盘的自动挂载

    1.关于luks加密 LUKS(Linux Unified Key Setup)为Linux硬盘分区加密提供了一种标准,它不仅能通用于不同的 Linux发行版本,还支持多用户/口令.因为它的加密密钥独 ...

  4. rsync 使用方法 ssh免密问题 不同端口同步

    不同端口同步(前提还是做好免密) 主要通过选项-e "ssh -p 端口"来实现 重命名了秘钥文件 指定-i即可~ 1. 本地目录同步到导地不同端口主机目录 [root@bakse ...

  5. c# json序列化不包括某列

    .[Newtonsoft.Json.JsonIgnore]特性:使用Newtonsoft.Json序列化时字段不会被序列化. .[System.Web.Script.Serialization.Scr ...

  6. 每月IT摘录201911

    技术 1.以 MySQL 的 InnoDB 引擎为例,由于 MySQL 中有两套日志机制,一套是存储层的 redo log,另一套是 server 层的 binlog,每次更新数据都要对两个日志进行更 ...

  7. WebBrowser内存泄露

    使用WebBrowser控件开发的程序,占用内存会随着时间不停增长,最终内存溢出导致崩溃.究其原因是由于其自身的缺陷造成的.每一次加载新页面,WebBrowser就会多占用10-20M内存,有资料说是 ...

  8. 【mysql】搜索带\字符

    模糊查询 LIKE '%\\\%'

  9. recttransform

    转载自https://www.jianshu.com/p/4592bf809c8b 1.Anchor:子物体和父物体联系的桥梁,Anchors是由两个点确定的,他们就是AnchorMin以及Ancho ...

  10. Faker伪数据生成

    版本信息:Faker==3.0.0factory-boy==2.12.0 provider: # encoding=utf-8 import randomfrom faker.providers im ...