Golang中一个不错的处理 JSON 的库 go-dproxy

Golang 自己就带了 JSON (encoding/json) 处理的库,也有第三方的 simplejson 之类的库,但总是感觉不如Python这样的动态语言方便,在 Python 里,数组和字典的处理都很方便,和 JSON 互转也非常简单。

encoding/json 最大的问题是不够灵活,需要预先定义很多的 struct 来进行编解码,这样对于处理结构不定的 JSON 文件非常不方便。

这里介绍一个名为 go-dproxy 的库,非常方便和简单,不需要预先定义 struct ,还可以类似 XPath 那样查找。

下面是一个例子:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

import (
  "encoding/json"
  "fmt"
  "github.com/koron/go-dproxy"
)

func main() {
  var v interface{}

  json.Unmarshal([]byte(`{
      "name": "dproxy",
  "strings": [ "a", "b", "c" ],
  "numbers": [ 1,2,3 ],
  "mixs": ["a", 1, "b"],

  "tags": {
    "key-1": "value-1",
    "key-2": 100,
    "key-3": [4,5,6]
  }
}`), &v)

  // s == "dproxy", got a string.
  s, _ := dproxy.New(v).M("name").String()

  fmt.Printf("1. name is %s\n", s)

  // err: not matched types: expected=int64 actual=string: name
  _, err := dproxy.New(v).M("name").Int64()
  fmt.Printf("2. err is %s\n", err)

  // can be chained. n == 3, got a int64
  n, _ := dproxy.New(v).M("numbers").A(2).Int64()
  fmt.Printf("3. n is %d\n", n)

  // got value-1
  s, _ = dproxy.New(v).M("tags").M("key-1").String()
  fmt.Printf("4. key-1 is %s\n", s)

  // err.Error() == "not found: data.kustom", wrong query can be verified.
  _, err = dproxy.New(v).M("data").M("kustom").String()
  fmt.Printf("5. err is %s\n", err)

  // n == 5
  n, err = dproxy.Pointer(v, "/tags/key-3/1").Int64()
  fmt.Printf("6. n is %d\n", n)

}

或者从 gist 下载这个文件,执行:

1
2
3
$ go get github.com/koron/go-dproxy
$ go build dproxy-test.go
$ ./dproxy-test

即可。

总之,这个库处理JSON应该算是非常简单,希望对你有所帮助。