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)
最佳实践
默认性能已经比标准库快几倍。如果你想有绝对最好的表现,你可以做以下事情
- 使用 JSONITER。配置最快,这将以 6 位精度(有损)浮点数,这要快得多
- 重用基础流或迭代器实例。ConfigFastest.BorrowIterator 或 jsoniter.ConfigFastest.BorrowStream. 记得在完成后 defer。
- 使用 RegisterTypeEncoder 或 RegisterTypeDecoder,而不是定义 MarshalJSON 或 UnmarshalJSON。减少了不必要的复制
type T struct{}
type Person struct {Name stringHobby 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 float32WorkAge int8Faimily 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.ConfigCompatibleWithStandardLibraryjson.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()}
}