Go json-iterator 详解

1,156 阅读2分钟

1. 介绍

go get github.com/json-iterator/go

jsoniter(json-iterator)是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本。从 dsljson 和 jsonparser 借鉴了大量代码。

json-iterator是由滴滴开源的第三方json编码库,在编码结构体时候,Go版本的效率是encoding/json的6倍,而Java版本的效率是官方的3倍。

2. Get() 方法

可以通过Get方法解析json字符串:

j := `{"name":{"first":"uncle","last":"suta"}}`
i := []byte(j)
b := jsoniter.Get(i, "name").Get("first")

fmt.Println(b.ToString())

jsoniter.Get()方法会返回一个Any接口的实现对象,其提供了以下的方法进行类型转化,或者像我们上面的例子那样,继续调用Get()方法获得更深层次的值:

type Any interface {
   LastError() error
   ValueType() ValueType
   MustBeValid() Any
   ToBool() bool
   ToInt() int
   ToInt32() int32
   ToInt64() int64
   ToUint() uint
   ToUint32() uint32
   ToUint64() uint64
   ToFloat32() float32
   ToFloat64() float64
   ToString() string
   ToVal(val interface{})
   Get(path ...interface{}) Any
   Size() int
   Keys() []string
   GetInterface() interface{}
   WriteTo(stream *Stream)
}

3. 序列化与反序列化

反序列化函数Unmarshal()可以将json字符串映射到一个我们规定的结构体的对象上,序列化函数Marshal()可以将结构体映射成为json字符串:

type Student struct {
   Name string `json:"name"`
   Age  int    `json:"age"`
}

func main() {
   // 序列化过程,将 stu 转化为 b 字符串
   stu := Student{
      Name: "树獭",
      Age:  00,
   }

   b, err := jsoniter.Marshal(stu)
   if err != nil {
      fmt.Println("transformation error: ", err)
   }
   
   fmt.Println(string(b)) //{"name":"树獭","age":00}
   
   // 反序列化过程,将 b 字符串转化为 stu2
   var stu2 Student
   err := jsoniter.Unmarshal(b, &stu2)

}

json-iterator 中的序列化与反序列化函数,在用法上与json以及gjson都是类似的。

4. 兼容官方库

同时 json-iterator 还完全兼容官方库的api:

json := jsoniter.ConfigCompatibleWithStandardLibrary

5. Java 版本的获得方式

<dependency>
    <groupId>com.jsoniter</groupId>
    <artifactId>jsoniter</artifactId>
    <version>0.9.19</version>
</dependency>

另外,我们可以从 jsoniter.com/index.cn.ht… 中文网站查看Java版本的使用说明。

本文正在参加技术专题18期-聊聊Go语言框架