Golang: 解析JSON数据之二
上次我们介绍了 Go 语言中序列化和反序列化 JSON 数据的两个方法 Marshal() 和 Unmarshal(),并以示例演示了它们的用法。
我们在例子中看到,需要事先声明好对应的结构体,才能跟 JSON 字段映射起来。
有的时候,如果 JSON 数据的定义过于复杂,我们需要一种更加灵活的方式来处理。在这种情况下,可以将 JSON 数据映射到一个 map 结构中。
下面我们就来演示一下这种方式:
// 使用map结构 将JSON字符串转为对象
package main
import (
"encoding/json"
"fmt"
)
var JSON = `{
"group": "programmer",
"persons": [
{
"name": "Jack",
"age": 25
},
{
"name": "Lily",
"age": 20
}
]
}`
func main() {
var bytes []byte
var data map[string]interface{}
// 先将字符串转为字节切片
bytes = []byte(JSON)
// 将字节切片映射到map上
json.Unmarshal(bytes, &data)
fmt.Println("group:", data["group"])
// 转为[]interface{}类型
persons := data["persons"].([]interface{})
for index, item := range persons {
// 类型转换
person := item.(map[string]interface{})
age := person["age"]
// 更改年龄
person["age"] = age.(float64) + 1
// 打印最新个人信息
fmt.Println("person", index, ":", person["name"].(string), age, "->", person["age"].(float64))
}
// 序列化为JSON字符串
newBytes, _ := json.MarshalIndent(&data, "", " ");
// 打印新的JSON数据
fmt.Println(string(newBytes))
}
在上面代码中,我们先定义了一个 map 变量,其 key 是 string 类型,value 是 interface{} 通用类型,这样可以兼容多种数据类型,在取值的时候进行一次类型转换即可。
之后我们调用 json.Unmarshal() 方法来将 JSON 字符串转为对象,这个我们前面也介绍过。
在转换完之后,取字段的时候我们应该以 map 的方式来执行,在取 persons 字段时,我们使用了下面这种方式:
// 转为[]interface{}类型
persons := data["persons"].([]interface{})
必选先转换为 []interface{} 类型,才能执行后续的 range 操作。在 range 内部,同样需要对当前遍历的对象做类型转换,才能安全地读写对象的数据。
最后,运行上面的程序,控制台打印内容如下:
group: programmer
person 0 : Jack 25 -> 26
person 1 : Lily 20 -> 21
{
"group": "programmer",
"persons": [
{
"age": 26,
"name": "Jack"
},
{
"age": 21,
"name": "Lily"
}
]
}
Golang: 解析JSON数据之二的更多相关文章
- Golang: 解析JSON数据之三
前面我们介绍了 Marshal 和 Unmarshal 方法,今天再解一下另外两个 API:Encoder 和 Decoder. Encoder Encoder 主要负责将结构对象编码成 JSON 数 ...
- Golang: 解析JSON数据之一
JSON 作为目前最流行的数据传输格式, 相信每个程序员都跟它打过交道吧.使用 Go 语言时,也不可避免的要操作 JSON 数据,令人惊喜的是,Go 内置了序列化和反序列化 JSON 的功能,今天就来 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- Java构造和解析Json数据的两种方法详解二——org.json
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...
- Java创建和解析Json数据方法(二)——org.json包的使用
(二)org.json包的使用 1.简介 工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...
- pyspider示例代码二:解析JSON数据
本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)
准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...
随机推荐
- dfs的两种处理方法
方法一: 对于源点s,初始化vis[s]=1,并且在dfs之后vis[s]=1,为下一次调用做准备 .对于dfs递归中的寻找后继的循环体,入栈出栈语句写在循环内. 模板: //调用 vis[s]=; ...
- cf1206解题报告
目录 cf1206解题报告 A B C D E,F cf1206解题报告 A 模拟 #include <bits/stdc++.h> using namespace std; int n, ...
- ROS+gre over ipv6,在ipv6的基础上建立GRE隧道
感谢群众大神 @镜花水月全程技术支持.感谢! 环境: 1.阿里云华北5,申请ipv6测试,申请ECS带ipv6公网ip 2.为了便于测试便捷,在vultr创建2.5美元的vps,带ipv6 对了,测试 ...
- 如何保证redis数据都是热点数据
mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据? 1.限定 Redis 占用的内存,Redis 会根据自身数据淘汰策略,加载热数据到内存.所以,计算 ...
- 课后选做题-MyOD
课后选做题-MyOD od命令的了解 功能 od命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符.od命令系统默 ...
- 如何快速将磁盘的MBR分区方式改成GPT分区方式
注:修改分区格式时此硬盘不能是在使用状态(简单说就是不能出现在盘符中),如果在使用中先在计算机的磁盘管理中删除卷. 由于MBR分区表模式的硬盘最大只支持2T的硬盘空间,而现在我们的硬盘越来越大,有时候 ...
- QuantLib 金融计算——收益率曲线之构建曲线(4)
[TOC] 如果未做特别说明,文中的程序都是 C++11 代码. QuantLib 金融计算--收益率曲线之构建曲线(4) 本文代码对应的 QuantLib 版本是 1.15.相关源代码可以在 Qua ...
- 【转帖】 PM RD QA OP
From 百度知道 一.PM: Product Manager,产品经理,又称品牌经理(Brand Manager).举凡产品从创意到上市,所有相关的研发.调研.生产.编预算.广告.促销活动等等,都由 ...
- Replication:事务复制 Transaction and Command
事务复制使用 dbo.msrepl_transactions 和 dbo.MSrepl_commands 存储用于数据同步的Transaction和Command.在replication中,每个co ...
- Java异常的10个关键知识点
前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...