From b9ab2bce742bffa417d3c01158f6062d5e05ecb4 Mon Sep 17 00:00:00 2001 From: klokare Date: Wed, 16 Aug 2017 04:25:21 +0200 Subject: [PATCH] Add null support to UnmarshalJSON (#58) Unmarshal null into zero value --- decimal.go | 6 +++++- decimal_test.go | 28 +++++++++++++++++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/decimal.go b/decimal.go index 9cdd494..fd54cb5 100644 --- a/decimal.go +++ b/decimal.go @@ -85,7 +85,7 @@ func New(value int64, exp int32) Decimal { func NewFromBigInt(value *big.Int, exp int32) Decimal { return Decimal{ value: big.NewInt(0).Set(value), - exp: exp, + exp: exp, } } @@ -615,6 +615,10 @@ func (d Decimal) Truncate(precision int32) Decimal { // UnmarshalJSON implements the json.Unmarshaler interface. func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + return nil + } + str, err := unquoteIfQuoted(decimalBytes) if err != nil { return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err) diff --git a/decimal_test.go b/decimal_test.go index 983c800..94d0db7 100644 --- a/decimal_test.go +++ b/decimal_test.go @@ -231,20 +231,19 @@ func TestNewFromFloatWithExponent(t *testing.T) { } } - func TestNewFromBigIntWithExponent(t *testing.T) { type Inp struct { val *big.Int - exp int32 + exp int32 } tests := map[Inp]string{ - Inp{big.NewInt(123412345),-3}: "123412.345", - Inp{big.NewInt(2234), -1}: "223.4", - Inp{big.NewInt(323412345), 1}: "3234123450", + Inp{big.NewInt(123412345), -3}: "123412.345", + Inp{big.NewInt(2234), -1}: "223.4", + Inp{big.NewInt(323412345), 1}: "3234123450", Inp{big.NewInt(423412345), 0}: "423412345", Inp{big.NewInt(52341235), -5}: "523.41235", - Inp{big.NewInt(623412345),-6}: "623.412345", - Inp{big.NewInt(723412345),-7}: "72.3412345", + Inp{big.NewInt(623412345), -6}: "623.412345", + Inp{big.NewInt(723412345), -7}: "72.3412345", } // add negatives @@ -299,6 +298,21 @@ func TestJSON(t *testing.T) { } } +func TestUnmarshalJSONNull(t *testing.T) { + var doc struct { + Amount Decimal `json:"amount"` + } + docStr := `{"amount": null}` + err := json.Unmarshal([]byte(docStr), &doc) + if err != nil { + t.Errorf("error unmarshaling %s: %v", docStr, err) + } else if !doc.Amount.Equal(Zero) { + t.Errorf("expected Zero, got %s (%s, %d)", + doc.Amount.String(), + doc.Amount.value.String(), doc.Amount.exp) + } +} + func TestBadJSON(t *testing.T) { for _, testCase := range []string{ "]o_o[",