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

dawnchen發表於2019-04-22

一、目錄

二、簡介

1. 為什麼要使用gjson?

golang初學者肯定會覺得Json的解析十分麻煩。其實是要轉換思維,我們不能像PHP或JS一樣把Json直接轉化為物件。
所以我們定義一系列的函式去獲取Json裡面的值。
gjson(github.com/tidwall/gjson) 很好的支援了各種Json操作。使用它可以方便地解析Json,並進行判斷、取值。

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")
}
複製程式碼

三、實際操作

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)
	}
}
複製程式碼

相關文章