mirror of
https://github.com/json-iterator/go.git
synced 2025-02-01 19:14:29 +02:00
fix fuzzy decoder from bool value to number
This commit is contained in:
parent
8c7fc7584a
commit
bc3221879d
@ -2,12 +2,13 @@ package extra
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/json-iterator/go"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
"io"
|
|
||||||
|
"github.com/json-iterator/go"
|
||||||
)
|
)
|
||||||
|
|
||||||
const maxUint = ^uint(0)
|
const maxUint = ^uint(0)
|
||||||
@ -200,6 +201,13 @@ func (decoder *fuzzyIntegerDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It
|
|||||||
str = string(number)
|
str = string(number)
|
||||||
case jsoniter.StringValue:
|
case jsoniter.StringValue:
|
||||||
str = iter.ReadString()
|
str = iter.ReadString()
|
||||||
|
case jsoniter.BoolValue:
|
||||||
|
b := iter.ReadBool()
|
||||||
|
if b == true {
|
||||||
|
str = "1"
|
||||||
|
} else {
|
||||||
|
str = "0"
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
iter.ReportError("fuzzyIntegerDecoder", "not number or string")
|
iter.ReportError("fuzzyIntegerDecoder", "not number or string")
|
||||||
}
|
}
|
||||||
@ -229,6 +237,14 @@ func (decoder *fuzzyFloat32Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It
|
|||||||
if newIter.Error != nil && newIter.Error != io.EOF {
|
if newIter.Error != nil && newIter.Error != io.EOF {
|
||||||
iter.Error = newIter.Error
|
iter.Error = newIter.Error
|
||||||
}
|
}
|
||||||
|
case jsoniter.BoolValue:
|
||||||
|
// support bool to float32
|
||||||
|
b := iter.ReadBool()
|
||||||
|
if b == true {
|
||||||
|
*((*float32)(ptr)) = 1
|
||||||
|
} else {
|
||||||
|
*((*float32)(ptr)) = 0
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
iter.ReportError("fuzzyFloat32Decoder", "not number or string")
|
iter.ReportError("fuzzyFloat32Decoder", "not number or string")
|
||||||
}
|
}
|
||||||
@ -251,6 +267,14 @@ func (decoder *fuzzyFloat64Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It
|
|||||||
if newIter.Error != nil && newIter.Error != io.EOF {
|
if newIter.Error != nil && newIter.Error != io.EOF {
|
||||||
iter.Error = newIter.Error
|
iter.Error = newIter.Error
|
||||||
}
|
}
|
||||||
|
case jsoniter.BoolValue:
|
||||||
|
// support bool to float64
|
||||||
|
b := iter.ReadBool()
|
||||||
|
if b == true {
|
||||||
|
*((*float64)(ptr)) = 1
|
||||||
|
} else {
|
||||||
|
*((*float64)(ptr)) = 0
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
iter.ReportError("fuzzyFloat32Decoder", "not number or string")
|
iter.ReportError("fuzzyFloat32Decoder", "not number or string")
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,12 @@ func Test_any_to_int64(t *testing.T) {
|
|||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(int64(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.Nil(jsoniter.UnmarshalFromString(`-10`, &val))
|
||||||
should.Equal(int64(-10), val)
|
should.Equal(int64(-10), val)
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
|
||||||
@ -57,6 +63,13 @@ func Test_any_to_int(t *testing.T) {
|
|||||||
should.Equal(10, val)
|
should.Equal(10, val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
// large float to int
|
// large float to int
|
||||||
@ -74,6 +87,13 @@ func Test_any_to_int16(t *testing.T) {
|
|||||||
should.Equal(int16(10), val)
|
should.Equal(int16(10), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(int16(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
// large float to int
|
// large float to int
|
||||||
@ -91,6 +111,13 @@ func Test_any_to_int32(t *testing.T) {
|
|||||||
should.Equal(int32(10), val)
|
should.Equal(int32(10), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(int32(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
// large float to int
|
// large float to int
|
||||||
@ -108,6 +135,13 @@ func Test_any_to_int8(t *testing.T) {
|
|||||||
should.Equal(int8(10), val)
|
should.Equal(int8(10), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(int8(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
// large float to int
|
// large float to int
|
||||||
@ -125,6 +159,13 @@ func Test_any_to_uint8(t *testing.T) {
|
|||||||
should.Equal(uint8(10), val)
|
should.Equal(uint8(10), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(uint8(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
// large float to int
|
// large float to int
|
||||||
@ -144,6 +185,12 @@ func Test_any_to_uint64(t *testing.T) {
|
|||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(uint64(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?
|
// TODO fix?
|
||||||
should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
|
should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
|
||||||
should.Equal(uint64(0), 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.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(uint32(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?
|
// TODO fix?
|
||||||
should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
|
should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
|
||||||
should.Equal(uint32(0), 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.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(uint16(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?
|
// TODO fix?
|
||||||
should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
|
should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
|
||||||
should.Equal(uint16(0), val)
|
should.Equal(uint16(0), val)
|
||||||
@ -205,6 +264,12 @@ func Test_any_to_uint(t *testing.T) {
|
|||||||
should.Equal(uint(10), val)
|
should.Equal(uint(10), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(uint(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
// large float to int
|
// large float to int
|
||||||
@ -223,6 +288,13 @@ func Test_any_to_float32(t *testing.T) {
|
|||||||
should.Equal(float32(10.1), val)
|
should.Equal(float32(10.1), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(float32(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))
|
||||||
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.Equal(float64(10.1), val)
|
||||||
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
|
||||||
should.Equal(float64(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))
|
||||||
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user