encoding/json vs json-iterator

本文比较了jsoniter与标准库在JSON编码上的性能差异,推荐jsoniter以实现更快的编码速度和100%兼容性。同时提供了编码最佳实践,如借用流实例、减少复制和自定义类型编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

encoding/json vs json-iterator

在这里插入图片描述

100% Compatibility

默认情况下,jsoniter 不会像标准库那样对映射键进行排序。如果你想要 100% 的兼容性,就这样使用

m := map[string]interface{}{
	"3": 3,
	"1": 1,
	"2": 2,
}
json := jsoniter.ConfigCompatibleWithStandardLibrary
b, err := json.Marshal(m)

最佳实践

默认性能已经比标准库快几倍。如果你想有绝对最好的表现,你可以做以下事情

  1. 使用 JSONITER。配置最快,这将以 6 位精度(有损)浮点数,这要快得多
  2. 重用基础流或迭代器实例。ConfigFastest.BorrowIterator 或 jsoniter.ConfigFastest.BorrowStream. 记得在完成后 defer。
  3. 使用 RegisterTypeEncoder 或 RegisterTypeDecoder,而不是定义 MarshalJSON 或 UnmarshalJSON。减少了不必要的复制
type T struct{}
type Person struct {
	Name    string
	Hobby   string `json:"-"`          // `json:"-"` 忽略字段; `json:"-,"`-> Field appears in JSON as key "-".
	Age     int    `json:"age,string"` // `json:"age,string"`适用于字符串、浮点数、整数或布尔类型
	IsGirl  bool   `json:",omitempty"` // json:",omitempty"省略nil,如果字段值是0,false,nil等省略不展示
	High    float32
	WorkAge int8
	Faimily interface{}
	T       T
}

var p = Person{Name: "maying", Hobby: "滑雪", Age: 30, High: 161.3, Faimily: map[string]interface{}{"father": "爸爸", "Age": 50}, WorkAge: 7}

func jsoniterStandardLibararyMarshal() {
	json := jsoniter.ConfigCompatibleWithStandardLibrary
	json.Marshal(&p)
}

func jsoniterFasterMarshal() {
	stream := jsoniter.ConfigFastest.BorrowStream(nil)
	defer jsoniter.ConfigFastest.ReturnStream(stream)
	stream.WriteVal(p)
	//fmt.Println(string(stream.Buffer()))
}

func jsonMarshal() {
	json.Marshal(p)
	//fmt.Println(string(b))
}

func Benchmark_jsoniterStandardLibararyMarshal(b *testing.B) {
	for i := 0; i < b.N; i++ {
		jsoniterStandardLibararyMarshal()
	}
}

func Benchmark_jsonMarshal(b *testing.B) {
	for i := 0; i < b.N; i++ {
		jsonMarshal()
	}
}
func Benchmark_jsoniterFasterMarshal(b *testing.B) {
	for i := 0; i < b.N; i++ {
		jsonMarshal()
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值