You've already forked json-iterator
mirror of
https://github.com/json-iterator/go.git
synced 2025-07-12 23:50:19 +02:00
Improve stdlib compatibility
1. Null values for primitive types no longer clear the original value in the destination object. 2. Dereference multiple levels of pointers in the destination interface{} type before unmarshaling into it. This is needed to match stdlib behavior when working with nested interface{} fields. If the destination object is a pointer to interface{} then the incoming nil value should nil out the destination object but keep the reference to that nil value on its parent object. However if the destination object is an interface{} value it should set the reference to nil but keep the original object intact. 3. Correctly handle typed nil decode destinations.
This commit is contained in:
@ -3,9 +3,10 @@ package jsoniter
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"github.com/stretchr/testify/require"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_read_null(t *testing.T) {
|
||||
@ -135,3 +136,33 @@ func Test_encode_nil_array(t *testing.T) {
|
||||
should.Nil(err)
|
||||
should.Equal("null", string(output))
|
||||
}
|
||||
|
||||
func Test_decode_nil_num(t *testing.T) {
|
||||
type TestData struct {
|
||||
Field int `json:"field"`
|
||||
}
|
||||
should := require.New(t)
|
||||
|
||||
data1 := []byte(`{"field": 42}`)
|
||||
data2 := []byte(`{"field": null}`)
|
||||
|
||||
// Checking stdlib behavior as well
|
||||
obj2 := TestData{}
|
||||
err := json.Unmarshal(data1, &obj2)
|
||||
should.Equal(nil, err)
|
||||
should.Equal(42, obj2.Field)
|
||||
|
||||
err = json.Unmarshal(data2, &obj2)
|
||||
should.Equal(nil, err)
|
||||
should.Equal(42, obj2.Field)
|
||||
|
||||
obj := TestData{}
|
||||
|
||||
err = Unmarshal(data1, &obj)
|
||||
should.Equal(nil, err)
|
||||
should.Equal(42, obj.Field)
|
||||
|
||||
err = Unmarshal(data2, &obj)
|
||||
should.Equal(nil, err)
|
||||
should.Equal(42, obj.Field)
|
||||
}
|
||||
|
Reference in New Issue
Block a user