Skip to content

Home_cn

Allen edited this page May 28, 2020 · 1 revision

English | 中文

json-iterator提供简洁的API,可以让你很方便地进行json序列化/反序列化;与encoding/json完全兼容,使用者可以快速、方便地迁移到json-iterator上来。此外,json-iterator还提供了很多其他方便的功能,如开放的序列化/反序列化配置、Extension、FieldEncoder/FieldDecoder、懒解析Any对象等等增强功能,应对不同使用场景下的json编码和解析,满足各种复杂的需求

简单的API

  • 序列化

    type Student struct{
        Name string
        Age int
        Height float32
    }
    
    b, err := jsoniter.Marshal(Student{"Allen", 18, 180.43})
  • 反序列化

    type Student struct{
        Name string
        Age int
        Height float32
    }
    
    var std Student
    err := jsoniter.Unmarshal([]byte(`{"Name":"Allen","Age":18,"Height":180.43}`), &std)

替代encoding/json

encoding/json可以很方便地迁移到json-iterator,并且迁移前后代码行为保持一致。不管你是使用基本的Marshal/Unmarshal接口,或是使用Encoder/Decoder,或是你已有的Marshaler/Unmarshaler实现,都能正常地工作。

// import "encoding/json"
// 
// json.Marshal(data)

import "github.com/json-iterator/go"

jsoniter.Marshal(data)

只需要把import的package替换成"github.com/json-iterator/go",包名从"json",替换成"jsoniter"即可

序列化/反序列化配置

json-iterator提供了几种序列化/反序列化配置,供不同的场景下的使用

api := jsoniter.Config{SortMapKeys:true}.Froze()
b, err := api.Marshal(map[string]string{"C":"c", "A":"a", "B":"b"})

上面的例子中,我们开启了SortMapKeys配置选项,让map序列化输出时字段进行排序输出。更多的选项说明,请参考Config章节

控制编解码行为

json-iterator提供了Extension机制,我们可以通过注册自己的Extension,来更精确地控制我们的序列化/反序列化行为

type sampleExtension struct {
    jsoniter.DummyExtension
}

func (e *sampleExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {
    if structDescriptor.Type.String() != "main.testStruct" {
        return
    }

    binding := structDescriptor.GetField("TestField")
    binding.FromNames = []string{"TestField", "Test_Field", "Test-Field"}
}

type testStruct struct {
    TestField string
}

var t testStruct
jsoniter.RegisterExtension(&sampleExtension{})
err := jsoniter.Unmarshal([]byte(`{"TestField":"aaa"}`), &t)
err = jsoniter.Unmarshal([]byte(`{"Test_Field":"bbb"}`), &t)
err = jsoniter.Unmarshal([]byte(`{"Test-Field":"ccc"}`), &t)

上面的例子中我们注册了一个Extension,它指定了testStructTestField字段名绑定到哪些字符串上,所有绑定的字符串在解析时都当成是该字段。更多的说明请参考Extension章节

快速操作json对象

json-iterator提供了Any对象,可以让你schemaless地从复杂嵌套json串中提取出感兴趣的部分

jsoniter.Get([]byte(`{"Field":{"InnerField":{"Name":"Allen"}}}`), "Field", "InnerField", "Name").ToString()

这里Get返回的是一个Any对象,我们获取嵌套结构体最内层的Name字段的Any对象,并调用ToString转换得到我们要的"Allen"字符串。更多的说明请参考Any章节