gojay

high performance JSON encoder/decoder with stream API for Golang
git clone git://git.lair.cx/gojay
Log | Files | Refs | README | LICENSE

commit 6161f8d7bcaef8100ec435460db0ce2ecd1cb6dc
parent f8ac1adb3c5dd61f87449ee9b3020e0d2836ca3a
Author: Salim Afiune <afiune@chef.io>
Date:   Fri, 24 Aug 2018 10:27:43 +0200

Avoid unmarshaling 'null' values

Signed-off-by: Salim Afiune <afiune@chef.io>

Diffstat:
Mdecode_interface.go | 8++++++++
Mdecode_interface_test.go | 23+++++++++++++++++++++++
2 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/decode_interface.go b/decode_interface.go @@ -24,6 +24,11 @@ func (dec *Decoder) decodeInterface(i *interface{}) error { return err } + // if start & end are equal the object is a null, don't unmarshal + if start == end { + return nil + } + object := dec.data[start:end] if err = json.Unmarshal(object, i); err != nil { return err @@ -48,6 +53,9 @@ func (dec *Decoder) getObject() (start int, end int, err error) { if err != nil { return } + // Set start & end to the same cursor to indicate the object + // is a null and should not be unmarshal + start = dec.cursor end = dec.cursor dec.cursor++ return diff --git a/decode_interface_test.go b/decode_interface_test.go @@ -344,6 +344,18 @@ func TestDecodeAsTestObject(t *testing.T) { skipCheckResult: true, }, { + name: "mull-interface", + json: `{ + "testInterface": null, + "testStr": "adios" + }`, + expectedResult: testObject{ + testInterface: interface{}(nil), + testStr: "adios", + }, + err: false, + }, + { name: "basic-interface", json: `{ "testInterface": { @@ -416,6 +428,7 @@ func TestUnmarshalInterface(t *testing.T) { json := []byte(`{ "testInterface": { "number": 1988, + "null": null, "string": "prost", "array": ["h","o","l","a"], "object": { @@ -438,6 +451,7 @@ func TestUnmarshalInterface(t *testing.T) { }, "number": float64(1988), "string": "prost", + "null": interface{}(nil), "array": []interface{}{"h", "o", "l", "a"}, "object": map[string]interface{}{ "k": "v", @@ -506,3 +520,12 @@ func TestDecodeInterfacePoolError(t *testing.T) { _ = dec.DecodeInterface(&result) assert.True(t, false, "should not be called as decoder should have panicked") } + +func TestDecodeNull(t *testing.T) { + var i interface{} + dec := BorrowDecoder(strings.NewReader("null")) + defer dec.Release() + err := dec.DecodeInterface(&i) + assert.Nil(t, err, "err should be nil") + assert.Equal(t, interface{}(nil), i, "value at given index should be the same as expected results") +}