go語言Json解析實用工具 - gjson

1、目錄

2、簡介

1. 爲何要使用gjson?

golang初學者確定會以爲Json的解析十分麻煩。實際上是要轉換思惟,咱們不能像PHP或JS同樣把Json直接轉化爲對象。
因此咱們定義一系列的函數去獲取Json裏面的值。
gjson(github.com/tidwall/gjson) 很好的支持了各類Json操做。使用它能夠方便地解析Json,並進行判斷、取值。git

2. Result結構體

// 首先定義一個Result結構體,它是全部數據的抽象
type Result struct {
	Type Type // 該結構體在Json中的類型
	Raw string // 原json串
	Str string // 字符串
	Num float64 // 浮點數
	Index int // 索引 
}

複製代碼

3. 屬於Result的函數

func (t Result) Exists() bool // 判斷某值是否存在 func (t Result) Value() interface{} // 
func (t Result) Int() int64 func (t Result) Uint() uint64 func (t Result) Float() float64 func (t Result) String() string func (t Result) Bool() bool func (t Result) Time() time.Time func (t Result) Array() []gjson.Result func (t Result) Map() map[string]gjson.Result func (t Result) Get(path string) Result func (t Result) ForEach(iterator func(key, value Result) bool) // 可傳閉包函數 func (t Result) Less(token Result, caseSensitive bool) bool 複製代碼

4. 初始化函數

gjson.Parse(json).Get("name").Get("last")
gjson.Get(json, "name").Get("last")
gjson.Get(json, "name.last")
複製代碼

5. 判斷Json是否合法

if !gjson.Valid(json) {
	return errors.New("invalid json")
}
複製代碼

3、實際操做

1. 使用

package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/tidwall/gjson"
)

const json = `{"name":{"first":"Tom","last":"Anderson"},"age":37,"children":["Sara","Alex","Jack"],"fav.movie":"Deer Hunter","friends":[{"first":"Dale","last":"Murphy","age":44},{"first":"Roger","last":"Craig","age":68},{"first":"Jane","last":"Murphy","age":47}]}`

func main() {
	// 首先咱們判斷該json是否合法
	if !gjson.Valid(json) {
		log.Fatalf("%s", "invalid json")
	}
	// 獲取Json中的age
	age := gjson.Get(json, `age`).Int()
	fmt.Printf("%T, %+v\n", age, age)
	// 獲取lastname
	lastname := gjson.Get(json, `name.last`).String()
	fmt.Printf("%T, %+v\n", lastname, lastname)
	// 獲取children數組
	for _, v := range gjson.Get(json, `children`).Array() {
		fmt.Printf("%q ", v.String())
	}
	fmt.Println()
	// 獲取第二個孩子
	fmt.Printf("%q\n", gjson.Get(json, `children.1`).String())
	fmt.Printf("%q\n", gjson.Get(json, `children|1`).String())
	// 通配符獲取第三個孩子
	fmt.Printf("%q\n", gjson.Get(json, `child*.2`).String())
	// 反轉數組函數
	fmt.Printf("%q\n", gjson.Get(json, `children|@reverse`).Array())
	// 自定義函數 - 全轉大寫
	gjson.AddModifier("case", func(json, arg string) string {
		if arg == "upper" {
			return strings.ToUpper(json)
		}
		return json
	})
	fmt.Printf("%+v\n", gjson.Get(json, `children|@case:upper`).Array())
	// 直接解析爲map
	jsonMap := gjson.Parse(json).Map()
	fmt.Printf("%+v\n", jsonMap)
	for _, v := range jsonMap {
		fmt.Printf("%T, %+v\n", v, v)
	}
}
複製代碼
相關文章
相關標籤/搜索