golang simplejson 学习

golang simplejson 学习

1 源码

package main

import (
	"encoding/json"
	"fmt"
	"reflect"
	"strconv"

	simplejson "github.com/bitly/go-simplejson"
)

var jsonStr = `{
  "msg" : "Success",
  "result" : {
    "timeline" : {
      "rows" : [ {
        "startTs" : 1528434707000,
        "number" : "x12887"
      }, {
        "startTs" : 1528434720000,
        "number" : "x13028"
      }, {
        "startTs" : 1528434721000,
        "number" : "x12975"
      }],
      "total" : 803254
    }
  }
}`

func main() {

	res, err := simplejson.NewJson([]byte(jsonStr))

	if err != nil {
		fmt.Printf("%v\n", err)
		return
	}
	// 未包含的key, 赋予默认值
	val := res.Get("company").MustString("example.com")
	fmt.Println(val)

	//获取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 eachMap, ok := row.(map[string]interface{}); ok {

			//可以看到eachMap["startTs"]类型是json.Number
			//而json.Number是golang自带json库中decode.go文件中定义的: type Number string
			//因此json.Number实际上是个string类型
			fmt.Println(reflect.TypeOf(eachMap["startTs"]))

			if startTs, ok := eachMap["startTs"].(json.Number); ok {
				startTsInt, err := strconv.ParseInt(string(startTs), 10, 0)
				if err == nil {
					fmt.Println(startTsInt)
				}
			}

			if number, ok := eachMap["number"].(string); ok {
				fmt.Println(number)
			}

			fmt.Println()
		}
	}
}

2 输出

➜  ~ go run go_demo.go
example.com
json.Number
1528434707000
x12887

json.Number
1528434720000
x13028

json.Number
1528434721000
x12975

➜  ~ 

3 参考

golang使用simplejson库解析复杂json

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Digital2Slave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值