mirror of
https://github.com/json-iterator/go.git
synced 2025-05-13 21:36:29 +02:00
fix #245, always reuse existing value even UseNumber
This commit is contained in:
parent
d51e841de0
commit
25fa392355
@ -7,6 +7,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
"github.com/modern-go/concurrent"
|
"github.com/modern-go/concurrent"
|
||||||
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config customize how the API should behave.
|
// Config customize how the API should behave.
|
||||||
@ -192,6 +193,11 @@ func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) {
|
|||||||
|
|
||||||
func (cfg *frozenConfig) useNumber(extension DecoderExtension) {
|
func (cfg *frozenConfig) useNumber(extension DecoderExtension) {
|
||||||
extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) {
|
extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
|
exitingValue := *((*interface{})(ptr))
|
||||||
|
if exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr {
|
||||||
|
iter.ReadVal(exitingValue)
|
||||||
|
return
|
||||||
|
}
|
||||||
if iter.WhatIsNext() == NumberValue {
|
if iter.WhatIsNext() == NumberValue {
|
||||||
*((*interface{})(ptr)) = json.Number(iter.readNumberAsString())
|
*((*interface{})(ptr)) = json.Number(iter.readNumberAsString())
|
||||||
} else {
|
} else {
|
||||||
|
@ -130,3 +130,20 @@ func Test_reader_and_load_more(t *testing.T) {
|
|||||||
obj := TestObject{}
|
obj := TestObject{}
|
||||||
should.Nil(decoder.Decode(&obj))
|
should.Nil(decoder.Decode(&obj))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_unmarshal_into_existing_value(t *testing.T) {
|
||||||
|
should := require.New(t)
|
||||||
|
type TestObject struct {
|
||||||
|
Field1 int
|
||||||
|
Field2 interface{}
|
||||||
|
}
|
||||||
|
var obj TestObject
|
||||||
|
m := map[string]interface{}{}
|
||||||
|
obj.Field2 = &m
|
||||||
|
cfg := jsoniter.Config{UseNumber: true}.Froze()
|
||||||
|
err := cfg.Unmarshal([]byte(`{"Field1":1,"Field2":{"k":"v"}}`), &obj)
|
||||||
|
should.NoError(err)
|
||||||
|
should.Equal(map[string]interface{}{
|
||||||
|
"k": "v",
|
||||||
|
}, m)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user