cnblogs原创

golang自带的json解析库encoding/json提供了json字符串到json对象的相互转换,在json字符串比较简单的情况下还是挺好用的,但是当json字符串比较复杂或者嵌套比较多的时候,就显得力不从心了,不可能用encoding/json那种为每个嵌套字段定义一个struct类型的方式,这时候使用simplejson库能够很方便的解析。例如,有这样一个嵌套很深的json字符串,例子如下:

{
"rc": 0,
"error": "Success",
"type": "stats",
"progress": 100,
"job_status": "COMPLETED",
"result": {
"total_hits": 803254,
"starttime": 1528434707000,
"endtime": 1528434767000,
"fields": [],
"timeline": {
"interval": 1000,
"start_ts": 1528434707000,
"end_ts": 1528434767000,
"rows": [{
"start_ts": 1528434707000,
"end_ts": 1528434708000,
"number": "x12887"
}, {
"start_ts": 1528434720000,
"end_ts": 1528434721000,
"number": "x13028"
}, {
"start_ts": 1528434721000,
"end_ts": 1528434722000,
"number": "x12975"
}, {
"start_ts": 1528434722000,
"end_ts": 1528434723000,
"number": "x12879"
}, {
"start_ts": 1528434723000,
"end_ts": 1528434724000,
"number": "x13989"
}],
"total": 803254
},
"total": 8
}
}

  

  对于上面的这个json字符串,其嵌套很深,如果要一个一个去定义对应的struct结构,无疑是一件比较费力的事情,如果使用simplejson库那就简单多了,实例代码如下:

package main

import (
"encoding/json"
"fmt"
"reflect"
"strconv" simplejson "github.com/bitly/go-simplejson"
) var json_str string = `{"rc" : 0,
"error" : "Success",
"type" : "stats",
"progress" : 100,
"job_status" : "COMPLETED",
"result" : {
"total_hits" : 803254,
"starttime" : 1528434707000,
"endtime" : 1528434767000,
"fields" : [ ],
"timeline" : {
"interval" : 1000,
"start_ts" : 1528434707000,
"end_ts" : 1528434767000,
"rows" : [ {
"start_ts" : 1528434707000,
"end_ts" : 1528434708000,
"number" : "x12887"
}, {
"start_ts" : 1528434720000,
"end_ts" : 1528434721000,
"number" : "x13028"
}, {
"start_ts" : 1528434721000,
"end_ts" : 1528434722000,
"number" : "x12975"
}, {
"start_ts" : 1528434722000,
"end_ts" : 1528434723000,
"number" : "x12879"
}, {
"start_ts" : 1528434723000,
"end_ts" : 1528434724000,
"number" : "x13989"
} ],
"total" : 803254
},
"total" : 8
}
}` func main() { res, err := simplejson.NewJson([]byte(json_str)) if err != nil {
fmt.Printf("%v\n", err)
return
} //获取json字符串中的 result 下的 timeline 下的 rows 数组
rows, err := res.Get("result").Get("timeline").Get("rows").Array() //遍历rows数组
for _, row := range rows {
//对每个row获取其类型,每个row相当于 C++/Golang 中的map、Python中的dict
//每个row对应一个map,该map类型为map[string]interface{},也即key为string类型,value是interface{}类型
if each_map, ok := row.(map[string]interface{}); ok { //可以看到each_map["start_ts"]类型是json.Number
//而json.Number是golang自带json库中decode.go文件中定义的: type Number string
//因此json.Number实际上是个string类型
fmt.Println(reflect.TypeOf(each_map["start_ts"])) if start_ts, ok := each_map["start_ts"].(json.Number); ok {
start_ts_int, err := strconv.ParseInt(string(start_ts), 10, 0)
if err == nil {
fmt.Println(start_ts_int)
}
} if number, ok := each_map["number"].(string); ok {
fmt.Println(number)
} }
}
}

  

golang使用simplejson库解析复杂json的更多相关文章

  1. Oracle 使用GSON库解析复杂json串

    在前文中讲到了如何使用JSON标准库解析json串,参考: Oracle解析复杂json的方法(转) 现补充一篇使用GSON库在Oracle中解析复杂json的方法. GSON串的使用教程参考官方文档 ...

  2. 使用QtScript库解析Json数组例子

    本文转载自:http://blog.sina.com.cn/s/blog_671732440100uwxh.html 使用qtscipt库解析json数组首先在工程文件中加 QT        += ...

  3. 两种库解析、构造 JSON

    1.用CJSON库 1.1解析Json 需要解析的JSON文件: { "name":"Tsybius", , "sex_is_male":t ...

  4. 基于开源库jsoncpp的json字符串解析

    json(JavaScript Object Notation)是一种轻量级高效数据交换格式.相比于XML,其更加简洁,解析更加方便.在实习期间,我负责的程序模块,多次使用到json进行数据传输.由于 ...

  5. 使用cJSON库解析和构建JSON字符串

    使用cJSON库解析和构建JSON字符串 前言 其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON: 使用cJSON库解析JSON JSON简介 当时在MCU平台上使用时,会 ...

  6. golang 开源项目: 配置解析模块--config

    在golang中,配置文件经常使用json格式.json格式的语法,有些繁琐,尤其是出现嵌套的时候,每一块都需要大括号包裹,看起来很臃肿. 本着简单易用的原则,个人开发了一个配置解析模块config, ...

  7. JS中将JSON的字符串解析成JSON数据格式《转》

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

  8. fastjson解析任意json

    fastjson解析任意json到bean 解析案例的代码 package com.base.config; import java.util.List; import com.alibaba.fas ...

  9. Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库

    一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...

随机推荐

  1. BZOJ3876 AHOI/JSOI2014支线剧情(上下界网络流)

    原图所有边下界设为1上界设为inf花费为时间,那么显然就是一个上下界最小费用流了.做法与可行流类似. 因为每次选的都是最短路增广,且显然不会有负权增广路,所以所求出来的可行流的费用就是最小的. #in ...

  2. MT【241】红蓝两色染色

    用红蓝两色给$3*3$的格子染色,要求每行每列每种颜色都有,则不同的染色方法_____ 分析:按红色格子数分类,1)红色3或者6个有6种.2)红色4或者5个有45种.故一共有2*(6+45)=102种 ...

  3. 修改 wordpress 后台管理员登录地址

    拷贝根目录下的 wp-login.php文件命名为wp-login.php.backup,把原文件重命名为managewp.phpsed -i "s/wp-login.php/managew ...

  4. 自学Linux Shell6.2-用户自定义环境变量

    点击返回 自学Linux命令行与Shell脚本之路 6.2-用户自定义环境变量 1.设置局部用户定义变量 一旦启动bash shell(或者执行一个shell脚本),你就能创建这个shell进程可见的 ...

  5. python多线程用法及与单线程耗时比较

    下面,通过一个简单的例子,来把多线程和单线程执行任务的耗时做个比较 import time import threading # 音乐播放器 def music(func, loop): for i ...

  6. python开启httpserver服务在自动化测试中的一个小运用

    httpserver可以在本机启动一个python实现的web服务器,在自动化测试中,可以将生成测试报告的目录开放给项目组同事. 先安装python 自动化测试框架,生成报告的目录D:\Automat ...

  7. luogu2178/bzoj4199 品酒大会 (SA+单调栈)

    他要求的就是lcp(x,y)>=i的(x,y)的个数和a[x]*a[y]的最大值 做一下后缀和,就只要求lcp=i的了 既然lcp(x,y)=min(h[rank[x]+1],..,[h[ran ...

  8. Spring MVC 起步

    跟踪Spring MVC的请求 在请求离开浏览器时①,会带有用户所请求内容的信息,至少会包含请求的URL. 请求旅程的第一站是Spring的DispatcherServlet.与大多数基于Java的W ...

  9. activity中访问内部fragment的函数

    @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCod ...

  10. A1059. Prime Factors

    Given any positive integer N, you are supposed to find all of its prime factors, and write them in t ...