jsoniter与原生json对比 之前看到过json-iterator库使用,为何替换掉原生的json呢,看了一下github,如下: json-iterator is a high-performance...里面存储的全是字符串,字符串长度姑且定位10吧,从字符串Unmarshal为slice string后,采用原生json与json-iter的对比,后面称呼json-iter为jsoniter吧。...jsoniter地址如下: https://github.com/json-iterator/go 1.场景1: 数组长度10 json goos: linux goarch: amd64 cpu: AMD...BenchmarkJson BenchmarkJson-8 171060 7230 ns/op 1161 B/op 22 allocs/op PASS jsoniter...确实比json有这不错的性能优势,从ns/op这个数据看到原生jsoniter是3-4倍的jsoniter,但是从allocs/op上来看效果差距不大。
而 jsoniter 略高于官方 json,不过相差不大。...这个场景下,只有官方 json 和 jsoniter 支持。...jsoniter 在处理非结构化 JSON 中,如果要解析一段 []byte 数据并获得其中的某个值,jsoniter 有以下相类似的方案。...而不是 jsoniter jsoniter 近年已经不活跃了,笔者前段时间提了一个 issue 没人回复。...换句话说,jsoniter 的适用场景比较有限。
而jsoniter略高于官方json,不过相差不大。...(一)jsoniter 在处理非结构化JSON中,如果要解析一段[]byte数据并获得其中的某个值,jsoniter有以下相类似的方案。...但是在易用性方便,jsonparser和jsoniter都需要开发者对获得的数据再做进一步的处理,因此jsoniter和jsonparser的易用性在这个场景下均略低。...jsoniter的性能虽然依然优于官方,但没有达到逆天的程度,如果希望有极致的性能,那么你应该选择easyjson而不是jsoniter。...换句话说,jsoniter的适用场景比较有限。
package iouitl_readall import ( "bytes" "io" "io/ioutil" "sync" jsoniter "github.com/json-iterator...= nil { return err } m := map[string]string{} err = jsoniter.Unmarshal(buffer.Bytes(), &m) return...= nil { return err } m := map[string]string{} err = jsoniter.Unmarshal(data, &m) return err }...= nil { return err } return nil } func JsonIter(r map[string]string) error { data, err := jsoniter.Marshal...是不是很奔溃,这是啥情况 jsoniter 本身就使用了 sync.Pool 作缓冲,我们使用 jsoniter.NewEncoder(buffer) 创建一个序列化实例,但是其内部并没有直接使用 io.Writer
如果你愿意牺牲精度的话,Jsoniter 可以选择只保留6位小数。在这个取舍下,可以好一些,但是 Protobuf 仍然是Jsoniter 的两倍。...在 Jsoniter 里,解码的循环被展开了:public static java.lang.Object decode_(com.jsoniter.JsonIterator iter) throws...在 Jsoniter 里,处理数组的循环也是被展开的。...Jsoniter 把这个差距从 10 倍缩小到了 3 倍多一些。...;4)解码整数:Protobuf 是 Jsoniter 的 2.64 倍,是 Jackson 的 8.51 倍。
因为公司存在 PHP 业务,为了兼容,JSON 的解析使用了 jsoniter 这个第三方包。...如果你也是使用 gin 框架,别忘了编译指定 -tags=jsoniter 构建标签:go build -tags=jsoniter -o ./${PROJECT_NAME} ..../cmd/server而 jsoniter 有个非常强大的功能,支持在解析类型的时候,执行你给定的钩子!...func init() {jsonAutoTrimSpace()}func jsonAutoTrimSpace() {jsoniter.RegisterTypeDecoderFunc("string",...func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {s := strings.TrimSpace(iter.ReadString())*((*string
// +build jsoniter package json import ( "fmt" "github.com/json-iterator/go" ) var ( json = jsoniter.ConfigCompatibleWithStandardLibrary...现在我们换一种编译运行方式: -> go run -tags=jsoniter main.go Use [jsoniter] package { "Name": "飞雪无情", "Blog":...条件编译 我们发现,条件编译的关键在于-tags=jsoniter,也就是-tags这个标志,这就是Go语言为我们提供的条件编译的方式之一。...jsoniter // +build jsoniter 这两行是Go语言条件编译的关键。+build可以理解为条件编译tags的声明关键字,后面跟着tags的条件。 // +build !...jsoniter表示,tags不是jsoniter的时候编译这个Go文件。 // +build jsoniter表示,tags是jsoniter的时候编译这个Go文件。
Jsoniter 把这个差距从 10 倍缩小到了 3 倍多一些。 JSON 最差的情况是下面几种: 跳过非常长的字符串:和字符串长度线性相关。...解码 double 字段:Protobuf 优势明显,是 Jsoniter的 3.27 倍,是 Jackson 的 13.75 倍。...如果接受精度损失,Protobuf 是 Jsoniter 的 1.96 倍。 解码整数:Protobuf 是 Jsoniter 的 2.64 倍,是 Jackson 的 8.51 倍。 ?...如果你的生产环境中的 JSON 没有那么多的 double 字段,都是字符串占大头,那么基本上来说替换成 Protobuf 也就是仅仅比 Jsoniter 提高一点点,肯定在 2 倍之内。
twitter.com" } } ]}测试结果通过测试JSON数据的marshal和unmarshal操作,总体上的耗时比较如下:marshal:Go官方EncodingJson(1) > Jsoniter...(1.08) > GoJson(1.65) > 字节跳动Sonic(2.92)unmarshal:Go官方EncodingJson(1) > Jsoniter(3.32) > GoJson(4.18...Name) return users}func UnmarshalByJsoniter(str string) Users { var users Users var json = jsoniter.ConfigCompatibleWithStandardLibrary...json.Unmarshal([]byte(str), &users) //jsoniter.Unmarshal([]byte(strJson), &users) /.../fmt.Println(string(val)) return val}func marshalByJsoniter(users Users) []byte { val, err := jsoniter.Marshal
这些字段官方库解析起来比较慢,下面是跑出来的结果 lib decode encode std 156737 ns/op 2392 ns/op jsoniter...: null }`) 调整后的数据如下: lib decode encode std 9301 ns/op 953.3 ns/op jsoniter...import ( "fmt" jsoniter "github.com/json-iterator/go" ) type ColorGroup struct { ID int...Name string Colors []string } func main() { var json = jsoniter.ConfigCompatibleWithStandardLibrary...val := []byte(`{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}`) fmt.Println(jsoniter.Get
= nil { logrus.WithFields(logrus.Fields{ "request": r, }).Errorf("jsoniter.Marshal failure: %v...", err) return nil, fmt.Errorf("jsoniter.Marshal failure: %v", err) } data := buffer.Bytes() req...failed, error:%v", err) return nil, fmt.Errorf("adapter jsoniter.Unmarshal failed, error:%v", err)...return res, nil } 这个示例和之前差不多,只是不仅用来读取 http.Response.Body 还用来创建一个 jsoniter.NewEncoder 用来把请求压缩成 json 字符串...,并且作为 http.NewRequest 的 body 参数, 如果直接用 jsoniter.Marshal 同样会创建很多次内存,jsoniter 也使用 buffer 做为缓冲区,并且默认大小为
MessageQueueKey]int64) wrapper := OffsetSerializeWrapper{ OffsetTable: datas, } err = jsoniter.Unmarshal...= nil { local.OffsetTable = datas } } load方法通过utils.FileReadAll(local.path)读取data,然后通过jsoniter.Unmarshal...wrapper := OffsetSerializeWrapper{ OffsetTable: local.OffsetTable, } data, _ := jsoniter.Marshal
使用说明如下: go get github.com/json-iterator/go 案例: import "encoding/json" json.Marshal(&data) var json = jsoniter.ConfigCompatibleWithStandardLibrary...json.Marshal(&data) json.Unmarshal(input, &data) var json = jsoniter.ConfigCompatibleWithStandardLibrary
下面我们采用json-iter/go的 GitHub 仓库中用来比较jsoniter、easyjson、std三个 JSON 库性能的数据来绘制条形图: package main import (...func main() { std := plotter.Values{35510, 1960, 99} easyjson := plotter.Values{8499, 160, 4} jsoniter...= nil { log.Fatal(err) } p.Title.Text = "jsoniter vs easyjson vs std" p.Y.Label.Text = ""...Offset设置偏移,因为每组对应位置的条形放在一起显示更好比较,将stdBar.Offset设置为-w会让其向左偏移一个条形的宽度;easyjson偏移不设置,默认为 0,不偏移;jsoniter偏移设置为...可以很直观地看到jsoniter的性能、内存占用、内存分配次数各方面都是顶尖的。可能用同一种维度的数据,数量级相差不大,图像会好看点(┬_┬)。 注意plotter.Color(2)这类用法。
我针对标准encoding/json包对 Jsoniter、EasyJson 进行了基准测试,结果如下。 下面是编码的结果,结果表明性能差异并不显着。...但是对于解码 JSON,jsoniter执行速度比标准编码包快 5 倍。 现在,如果您的请求已被解码,下一步可能是应用您的业务逻辑,并可能执行一些数据库操作。...尽管如此,我认为像 echo + jsoniter + go-pgGo 等标准库功能的所有令人敬畏的东西将是构建微服务并避免冗余代码的最快方法。
默认的是Golang(Go语言)内置的JSON,当然你也可以使用jsoniter,据说速度很快。...如果要使用jsoniter,我们在go build编译的时候只需要这么做即可: go build -tags=jsoniter ....这样我们就是用了jsoniter,是基于条件编译的技术,具体可以参考我这篇文章 Go语言中自动选择json解析库 。
21668 ns/op 601.57 MB/s 10940 B/op 4 allocs/op BenchmarkEncoder_Generic_JsonIter...ns/op 3118.99 MB/s 10757 B/op 4 allocs/op BenchmarkEncoder_Parallel_Generic_JsonIter...ns/op 10785.23 MB/s 11546 B/op 4 allocs/op BenchmarkEncoder_Parallel_Binding_JsonIter...ns/op 226.35 MB/s 50874 B/op 772 allocs/op BenchmarkDecoder_Parallel_Generic_JsonIter...ns/op 472.58 MB/s 10576 B/op 208 allocs/op BenchmarkDecoder_Parallel_Binding_JsonIter
MessageQueueKey]int64) wrapper := OffsetSerializeWrapper{ OffsetTable: datas, } err = jsoniter.Unmarshal...= nil { local.OffsetTable = datas } } load方法通过utils.FileReadAll(local.path)读取data,然后通过jsoniter.Unmarshal...wrapper := OffsetSerializeWrapper{ OffsetTable: local.OffsetTable, } data, _ := jsoniter.Marshal
github地址:https://github.com/uber-go/zap jsoniter 做业务开发离不开json的序列化与反序列化,标准库虽然提供了encoding/json,但是它主要是通过反射来实现的...jsoniter可以解决这个痛点,其是一款快且灵活的 JSON 解析器,具有良好的性能并能100%兼容标准库,我们可以使用jsoniter替代encoding/json,官方文档称可以比标准库快6倍多,...来自官方文档 github地址:https://github.com/json-iterator/go 对于jsoniter优化原理感兴趣的可以移步这里:http://jsoniter.com/benchmark.html
这里推荐采用jsoniter替换掉go原生encoding/json,两者接口一致,但jsoniter的性能远远超过encoding/json,Benchmark详见如下:ns/opallocation...allocs/opeasyjson decode8499 ns/op160 B/op4 allocs/opjsoniter decode5623 ns/op160 B/op3 allocs/opimport jsoniter..."github.com/json-iterator/go"var json = jsoniter.ConfigCompatibleWithStandardLibraryjson.Marshal(&data...in Go is always prone… | by Vincent Blanchon | A Journey With Go | MediumFastest JSON parser ever (jsoniter.com
领取专属 10元无门槛券
手把手带您无忧上云