一、简介


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

二、简单的API


  • 序列化 ```go type Student struct{ Name string Age int Height float32 }

b, err := jsoniter.Marshal(Student{“Allen”, 18, 180.43})

  1. - **反序列化**
  2. ```go
  3. type Student struct{
  4. Name string
  5. Age int
  6. Height float32
  7. }
  8. var std Student
  9. err := jsoniter.Unmarshal([]byte(`{"Name":"Allen","Age":18,"Height":180.43}`), &std)

三、替代encoding/json


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

  1. // import "encoding/json"
  2. //
  3. // json.Marshal(data)
  4. import "github.com/json-iterator/go"
  5. jsoniter.Marshal(data)

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

四、序列化/反序列化配置


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

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

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

五、控制编解码行为


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

  1. type sampleExtension struct {
  2. jsoniter.DummyExtension
  3. }
  4. func (e *sampleExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {
  5. if structDescriptor.Type.String() != "main.testStruct" {
  6. return
  7. }
  8. binding := structDescriptor.GetField("TestField")
  9. binding.FromNames = []string{"TestField", "Test_Field", "Test-Field"}
  10. }
  11. type testStruct struct {
  12. TestField string
  13. }
  14. var t testStruct
  15. jsoniter.RegisterExtension(&sampleExtension{})
  16. err := jsoniter.Unmarshal([]byte(`{"TestField":"aaa"}`), &t)
  17. err = jsoniter.Unmarshal([]byte(`{"Test_Field":"bbb"}`), &t)
  18. err = jsoniter.Unmarshal([]byte(`{"Test-Field":"ccc"}`), &t)

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

快速操作json对象


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

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

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