diff --git a/patch.go b/patch.go index 16bcbf6..26f50f5 100644 --- a/patch.go +++ b/patch.go @@ -225,17 +225,14 @@ func equalValue(x, y Value) bool { // * It fails to precisely compare integers beyond ±2⁵³. // * It cannot handle values greater than ±math.MaxFloat64. // * Comparison of objects with duplicate names has undefined behavior. - unmarshal := func(v Value) (vi interface{}) { + unmarshal := func(v Value) (vi interface{}, ok bool) { v = v.Clone() v.Standardize() - if json.Unmarshal(v.Pack(), &vi) != nil { - return nil - } - return vi + return vi, json.Unmarshal(v.Pack(), &vi) == nil } - vx := unmarshal(x) - vy := unmarshal(y) - return reflect.DeepEqual(vx, vy) && vx != nil && vy != nil + vx, okx := unmarshal(x) + vy, oky := unmarshal(y) + return okx && oky && reflect.DeepEqual(vx, vy) } func (obj *Object) getAt(i int) ValueTrimmed { diff --git a/patch_test.go b/patch_test.go index 4808d6b..122e44d 100644 --- a/patch_test.go +++ b/patch_test.go @@ -179,6 +179,14 @@ var testdataPatch = []struct { in: `{"fizz":["buzz","wuzz"],"fizzy":"wizzy"}`, patch: `[{ "op": "test", "path": "/noexist", "value": null }]`, wantErr: errors.New(`hujson: patch operation 0: value not found`), +}, { + in: `{"a":null}`, + patch: `[{ "op": "test", "path": "/a", "value": null }]`, + want: `{"a":null}`, +}, { + in: `{"a":null}`, + patch: `[{ "op": "test", "path": "/a", "value": 0 }]`, + wantErr: errors.New(`hujson: patch operation 0: values differ at "/a"`), }, { in: `{}`, patch: `[{`,