#622·go

多个不同库的 RegisterTypeDecoderFunc 会覆盖?

Author: hiscalerCreated Jul 12, 2022Updated Jun 10, 2025

我用了 A 库 和 B 库,两者都设置了 RegisterTypeDecoderFunc,比如

go
// 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()
		}
	})
go
// 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,如果同一个方法中同时使用了两个库,则会导致混乱。请问有什么办法避免吗?