剑客
关注科技互联网

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

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

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

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

下面是一个例子:

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
下载这个文件,执行:

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

即可。

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

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址