Go语言未知结构的json解析包go-simplejson

Go语言笔记-未知结构的json解析包go-simplejson

导入包
1
2
import github.com/bitly/go-simplejson
go get -v "github.com/bitly/go-simplejson"
使用例子
1
2
3
4
5
6
7
8
9
10
11
12
13

// 定义未知格式的json格式
var json = `{
"test": {
"array": [1, "2", 3],
"arraywithsubs": [
{"subkeyone": 1},
{"subkeytwo": 2, "subkeythree": 3}
],
"bignum": 9223372036854775807,
"uint64": 18446744073709551615
}
}`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
buf := bytes.NewBuffer([]byte(jsonStr))

// 通过从io.Reader取值,然后解码返回一个*Json
js, err := simplejson.NewFromReader(buf)
if err != nil {
log.Printf("unknown format string, error:%v", err)
return
}

arr, _ := js.Get("test").Get("array").Array() // [1, "2", 3] 注意数据类型

for i, v := range arr {
var iv int
switch v.(type) {
case json.Number:
i64, err := v.(json.Number).Int64()
if err != nil {
log.Printf("got err %#v\n", err)
}
iv = int(i64)
case string:
iv, _ = strconv.Atoi(v.(string))
}
if iv != i+1 {
log.Printf("got %#v expected %#v\n", iv, i+1)
}
}

// {"subkeyone": 1},
mm := js.Get("test").Get("arraywithsubs").GetIndex(0).MustMap()
if !reflect.DeepEqual(mm, map[string]interface{}{"subkeyone": json.Number("1")}) {
log.Printf("got %#v\n", mm)
}
包函数介绍
1
2
// NewFromReader 通过从io.Reader取值,然后解码返回一个*Json
func NewFromReader(r io.Reader) (*Json, error)
1
2
// Array 类型断言成 `array`
func (j *Json) Array() ([]interface{}, error)
1
2
// MustArray 保证返回一个' []interface{} '(默认为可选),当你想以一种简洁的方式对数组值进行交互时很有用
func (j *Json) MustArray(args ...[]interface{}) []interface{}
1
2
// Get返回一个指向一个新的Json对象的指针,该对象在其map表示法中的key表示形式对链接操作(用于遍历嵌套Json)很有用,即多个Get连用表示嵌套获取值
func (j *Json) Get(key string) *Json
1
2
3
// js.Get("top_level").Get("array").GetIndex(1).Get("key").Int()
// GetIndex 根据index获取,Json对象的指针
func (j *Json) GetIndex(index int) *Json
1
2
3
4
5
6
7
8
9
10
11
12
// NewJson 在解封body后返回一个指向新`Json`对象的指针

// NewJson returns a pointer to a new `Json` object
// after unmarshaling `body` bytes
func NewJson(body []byte) (*Json, error) {
j := new(Json)
err := j.UnmarshalJSON(body)
if err != nil {
return nil, err
}
return j, nil
}
1
2
3
4
5
6
// CheckGet 返回一个指向新Json对象的指针和一个标识成功或失败的bool
func (j *Json) CheckGet(key string) (*Json, bool)

if data, ok := js.Get("top_level").CheckGet("inner"); ok {
log.Println(data)
}