diff --git a/extra/fuzzy_decoder.go b/extra/fuzzy_decoder.go index 2dae7af..9b63c27 100644 --- a/extra/fuzzy_decoder.go +++ b/extra/fuzzy_decoder.go @@ -2,12 +2,13 @@ package extra import ( "encoding/json" - "github.com/json-iterator/go" + "io" "math" "reflect" "strings" "unsafe" - "io" + + "github.com/json-iterator/go" ) const maxUint = ^uint(0) @@ -200,6 +201,12 @@ func (decoder *fuzzyIntegerDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It str = string(number) case jsoniter.StringValue: str = iter.ReadString() + case jsoniter.BoolValue: + if iter.ReadBool() { + str = "1" + } else { + str = "0" + } default: iter.ReportError("fuzzyIntegerDecoder", "not number or string") } @@ -229,6 +236,13 @@ func (decoder *fuzzyFloat32Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It if newIter.Error != nil && newIter.Error != io.EOF { iter.Error = newIter.Error } + case jsoniter.BoolValue: + // support bool to float32 + if iter.ReadBool() { + *((*float32)(ptr)) = 1 + } else { + *((*float32)(ptr)) = 0 + } default: iter.ReportError("fuzzyFloat32Decoder", "not number or string") } @@ -251,6 +265,13 @@ func (decoder *fuzzyFloat64Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It if newIter.Error != nil && newIter.Error != io.EOF { iter.Error = newIter.Error } + case jsoniter.BoolValue: + // support bool to float64 + if iter.ReadBool() { + *((*float64)(ptr)) = 1 + } else { + *((*float64)(ptr)) = 0 + } default: iter.ReportError("fuzzyFloat32Decoder", "not number or string") } diff --git a/extra/fuzzy_decoder_test.go b/extra/fuzzy_decoder_test.go index a59bf7c..b6a1559 100644 --- a/extra/fuzzy_decoder_test.go +++ b/extra/fuzzy_decoder_test.go @@ -38,6 +38,12 @@ func Test_any_to_int64(t *testing.T) { should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(int64(10), val) + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(int64(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(int64(1), val) + should.Nil(jsoniter.UnmarshalFromString(`-10`, &val)) should.Equal(int64(-10), val) should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) @@ -57,6 +63,13 @@ func Test_any_to_int(t *testing.T) { should.Equal(10, val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(10, val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(0, val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(1, val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) // large float to int @@ -74,6 +87,13 @@ func Test_any_to_int16(t *testing.T) { should.Equal(int16(10), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(int16(10), val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(int16(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(int16(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) // large float to int @@ -91,6 +111,13 @@ func Test_any_to_int32(t *testing.T) { should.Equal(int32(10), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(int32(10), val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(int32(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(int32(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) // large float to int @@ -108,6 +135,13 @@ func Test_any_to_int8(t *testing.T) { should.Equal(int8(10), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(int8(10), val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(int8(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(int8(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) // large float to int @@ -125,6 +159,13 @@ func Test_any_to_uint8(t *testing.T) { should.Equal(uint8(10), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(uint8(10), val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(uint8(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(uint8(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) // large float to int @@ -144,6 +185,12 @@ func Test_any_to_uint64(t *testing.T) { should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(uint64(10), val) + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(uint64(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(uint64(1), val) + // TODO fix? should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val)) should.Equal(uint64(0), val) @@ -165,6 +212,12 @@ func Test_any_to_uint32(t *testing.T) { should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(uint32(10), val) + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(uint32(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(uint32(1), val) + // TODO fix? should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val)) should.Equal(uint32(0), val) @@ -186,6 +239,12 @@ func Test_any_to_uint16(t *testing.T) { should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(uint16(10), val) + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(uint16(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(uint16(1), val) + // TODO fix? should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val)) should.Equal(uint16(0), val) @@ -205,6 +264,12 @@ func Test_any_to_uint(t *testing.T) { should.Equal(uint(10), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(uint(10), val) + + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(uint(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(uint(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) // large float to int @@ -223,6 +288,13 @@ func Test_any_to_float32(t *testing.T) { should.Equal(float32(10.1), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(float32(10), val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(float32(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(float32(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) } @@ -240,6 +312,13 @@ func Test_any_to_float64(t *testing.T) { should.Equal(float64(10.1), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(float64(10), val) + + // bool part + should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) + should.Equal(float64(0), val) + should.Nil(jsoniter.UnmarshalFromString(`true`, &val)) + should.Equal(float64(1), val) + should.NotNil(jsoniter.UnmarshalFromString("{}", &val)) should.NotNil(jsoniter.UnmarshalFromString("[]", &val)) }