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 ...
随机推荐
- 使用uwsgi+nginx部署项目
Uwsgi:部署web应用程序 Nginx:反向代理,静态服务器 1.修改uwsgi配置文件>nginx反向代理[nginx接收请求->传递->[uwsgi] http=.. --& ...
- mac下操作小记
安装homebrew https://juejin.im/post/5c738bacf265da2deb6aaf97 主要问题:按官网安装方法(/usr/bin/ruby -e "$(cur ...
- filbeat遇到的坑(运行久和文件数据量多时候 )
1.现像,吃cpu,&& io 过程:量大的时候发现在filbeat很吃io, 原因: 日志量文件数太多,因为日志是2m一个文件 ,一天几十个G 开始怀疑是centos 6的问题,, ...
- .net core 中的多环境配置
参考地址:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-2.2 官网说环 ...
- YYCache 的整体架构类图

- Prometheus + Consul 自动发现服务监控
一.Prometheus支持的多种服务发现机制(常用如下) static_configs: 静态服务发现 file_sd_configs: 文件服务发现 dns_sd_configs: DNS 服务发 ...
- 理解Spring中的IoC和DI
什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...
- 避免因为Arcgis Server服务设置不当导致Oracle Process溢出的方法
我之前写过一篇文章<arcsoc进程无限增长导致oracle processes溢出>(见链接:https://www.cnblogs.com/6yuhang/p/9379086.html ...
- docker image 镜像导入导出
docker image save -o webv6.tar techcn/noble.web:v6docker image load -i webv6.tar -q
- 【LeetCode】缺失的第一个正数【原地HashMap】
给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...