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