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:
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")
+}