设为首页 加入收藏

TOP

github.com/json-iterator/go 详细教程(一)
2023-09-09 10:25:40 】 浏览:525
Tags:github.com/json-iterator/go

最近接触到了 github.com/json-iterator/go , 是由滴滴开源的第三方json编码库,它同时提供Go和Java两个版本。

文中大量内容来自 github 上的 wiki 文档,有兴趣的朋友可以直接点击 Home 跳转到官方文档查阅。

本文加了些自己的思考以及相关的详细学习例子,废话不多说了,冲!!!

1、基础介绍

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

1.1、简单的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)
    

1.2、替代encoding/json

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

这一点还是挺重要的,尤其是对于替换成该 json 库的项目。

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

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

jsoniter.Marshal(data)

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

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

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

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

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

1.4、控制编解码行为

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

1.5、快速操作json对象

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

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

// output: Allen

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

2、Config (重点)

下来内容全部来自官网,Config_cn 点击上面链接即可跳转。

json-iterator提供了一些常用的序列化/反序列化选型供配置,使用者可以根据自己需求打开/关闭特定的选项

2.1、配置选项

要配置序列化/反序列化选项,你需要创建一个Config结构体,并通过设置其字段来设置不同的选项,最后你还需要调用其Froze方法来生成这个Config对应的API对象,通过这个API对象来调用你的配置选项对应的序列化/反序列化函数。

api := jsoniter.Config{SortMapKeys:true}.Froze()
api.Marshal(data
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/12/12
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go语法糖 下一篇Go 输出函数

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目