mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package jsonx
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/buger/jsonparser"
 | 
						|
)
 | 
						|
 | 
						|
const jsonStr = `{
 | 
						|
	"username": "test",
 | 
						|
	"age": 12,
 | 
						|
	"person": {
 | 
						|
	  "name": {
 | 
						|
		"first": "Leonid",
 | 
						|
		"last": "Bugaev",
 | 
						|
		"fullName": "Leonid Bugaev"
 | 
						|
	  },
 | 
						|
	  "github": {
 | 
						|
		"handle": "buger",
 | 
						|
		"followers": 109
 | 
						|
	  },
 | 
						|
	  "avatars": [
 | 
						|
		{ "url": "https://avatars1.githubusercontent.com/u/14009?v=3&s=460", "type": "thumbnail" }
 | 
						|
	  ]
 | 
						|
	},
 | 
						|
	"company": {
 | 
						|
	  "name": "Acme"
 | 
						|
	}
 | 
						|
  }`
 | 
						|
 | 
						|
func TestGetString(t *testing.T) {
 | 
						|
	// val, err := GetString(jsonStr, "username")
 | 
						|
 | 
						|
	// 错误路径
 | 
						|
	// val, err := GetString(jsonStr, "username1")
 | 
						|
 | 
						|
	// 含有数组的
 | 
						|
	val, err := GetString(jsonStr, "person.avatars.[0].url")
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		fmt.Println("error: ", err.Error())
 | 
						|
	} else {
 | 
						|
		fmt.Println(val)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestGetInt(t *testing.T) {
 | 
						|
	val, _ := GetInt(jsonStr, "age")
 | 
						|
	val2, _ := GetInt(jsonStr, "person.github.followers")
 | 
						|
	fmt.Println(val, ",", val2)
 | 
						|
}
 | 
						|
 | 
						|
// 官方demo
 | 
						|
func TestJsonParser(t *testing.T) {
 | 
						|
	data := []byte(jsonStr)
 | 
						|
	// You can specify key path by providing arguments to Get function
 | 
						|
	jsonparser.Get(data, "person", "name", "fullName")
 | 
						|
 | 
						|
	// There is `GetInt` and `GetBoolean` helpers if you exactly know key data type
 | 
						|
	jsonparser.GetInt(data, "person", "github", "followers")
 | 
						|
 | 
						|
	// When you try to get object, it will return you []byte slice pointer to data containing it
 | 
						|
	// In `company` it will be `{"name": "Acme"}`
 | 
						|
	jsonparser.Get(data, "company")
 | 
						|
 | 
						|
	// If the key doesn't exist it will throw an error
 | 
						|
	var size int64
 | 
						|
	if value, err := jsonparser.GetInt(data, "company", "size"); err == nil {
 | 
						|
		size = value
 | 
						|
		fmt.Println(size)
 | 
						|
	}
 | 
						|
 | 
						|
	// You can use `ArrayEach` helper to iterate items [item1, item2 .... itemN]
 | 
						|
	jsonparser.ArrayEach(data, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
 | 
						|
		fmt.Println(jsonparser.Get(value, "url"))
 | 
						|
	}, "person", "avatars")
 | 
						|
 | 
						|
	// Or use can access fields by index!
 | 
						|
	jsonparser.GetString(data, "person", "avatars", "[0]", "url")
 | 
						|
 | 
						|
	// You can use `ObjectEach` helper to iterate objects { "key1":object1, "key2":object2, .... "keyN":objectN }
 | 
						|
	jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
 | 
						|
		fmt.Printf("Key: '%s'\n Value: '%s'\n Type: %s\n", string(key), string(value), dataType)
 | 
						|
		return nil
 | 
						|
	}, "person", "name")
 | 
						|
 | 
						|
	// The most efficient way to extract multiple keys is `EachKey`
 | 
						|
 | 
						|
	paths := [][]string{
 | 
						|
		[]string{"person", "name", "fullName"},
 | 
						|
		[]string{"person", "avatars", "[0]", "url"},
 | 
						|
		[]string{"company", "url"},
 | 
						|
	}
 | 
						|
 | 
						|
	jsonparser.EachKey(data, func(idx int, value []byte, vt jsonparser.ValueType, err error) {
 | 
						|
		switch idx {
 | 
						|
		case 0: // []string{"person", "name", "fullName"}
 | 
						|
			{
 | 
						|
			}
 | 
						|
		case 1: // []string{"person", "avatars", "[0]", "url"}
 | 
						|
			{
 | 
						|
			}
 | 
						|
		case 2: // []string{"company", "url"},
 | 
						|
			{
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}, paths...)
 | 
						|
}
 |