-
Notifications
You must be signed in to change notification settings - Fork 1k
Home_cn
English | 中文
json-iterator提供简洁的API,可以让你很方便地进行json序列化/反序列化;与encoding/json完全兼容,使用者可以快速、方便地迁移到json-iterator上来。此外,json-iterator还提供了很多其他方便的功能,如开放的序列化/反序列化配置、Extension、FieldEncoder/FieldDecoder、懒解析Any对象等等增强功能,应对不同使用场景下的json编码和解析,满足各种复杂的需求
-
序列化
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可以很方便地迁移到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
,它指定了testStruct
的TestField
字段名绑定到哪些字符串上,所有绑定的字符串在解析时都当成是该字段。更多的说明请参考Extension章节
json-iterator提供了Any
对象,可以让你schemaless地从复杂嵌套json串中提取出感兴趣的部分
jsoniter.Get([]byte(`{"Field":{"InnerField":{"Name":"Allen"}}}`), "Field", "InnerField", "Name").ToString()
这里Get
返回的是一个Any
对象,我们获取嵌套结构体最内层的Name
字段的Any
对象,并调用ToString
转换得到我们要的"Allen"字符串。更多的说明请参考Any章节