Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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章节

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /