encoding/json vs json-iterator

encoding/json vs json-iterator

encoding/json vs json-iterator_第1张图片

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()
	}
}

你可能感兴趣的:(Go语言,go,json)