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语言框架