多个不同库的 RegisterTypeDecoderFunc 会覆盖?
Author: hiscalerCreated Jul 12, 2022Updated Jun 10, 2025
我用了 A 库 和 B 库,两者都设置了 RegisterTypeDecoderFunc,比如
// A 库
jsoniter.RegisterTypeDecoderFunc("bool", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
switch iter.WhatIsNext() {
case jsoniter.StringValue:
var t bool
v := strings.TrimSpace(iter.ReadString())
if v != "" {
var err error
if t, err = strconv.ParseBool(strings.ToLower(v)); err != nil {
iter.Error = err
return
}
}
*((*bool)(ptr)) = t
case jsoniter.NumberValue:
if v, err := iter.ReadNumber().Int64(); err != nil {
iter.Error = err
return
} else {
*((*bool)(ptr)) = v > 0
}
case jsoniter.NilValue:
iter.Skip()
*((*bool)(ptr)) = false
default:
*((*bool)(ptr)) = iter.ReadBool()
}
})// B 库
jsoniter.RegisterTypeDecoderFunc("bool", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
switch iter.WhatIsNext() {
case jsoniter.StringValue:
var t bool
v := strings.TrimSpace(iter.ReadString())
if v != "" {
var err error
if t, err = strconv.ParseBool(strings.ToLower(v)); err != nil {
iter.Error = err
return
}
}
*((*bool)(ptr)) = t
case jsoniter.NumberValue:
if v, err := iter.ReadNumber().Int64(); err != nil {
iter.Error = err
return
} else {
*((*bool)(ptr)) = v == 0
}
case jsoniter.NilValue:
iter.Skip()
*((*bool)(ptr)) = false
default:
*((*bool)(ptr)) = iter.ReadBool()
}
})简单的说就是 A 库 1 看做是 True,而 B 库 0 看做是 True,如果同一个方法中同时使用了两个库,则会导致混乱。请问有什么办法避免吗?
Source: json-iterator/go