Add null support to UnmarshalJSON (#58)

Unmarshal null into zero value
This commit is contained in:
klokare 2017-08-16 04:25:21 +02:00 committed by Victor Quinn
parent 3c692774ac
commit b9ab2bce74
2 changed files with 26 additions and 8 deletions

View file

@ -615,6 +615,10 @@ func (d Decimal) Truncate(precision int32) Decimal {
// UnmarshalJSON implements the json.Unmarshaler interface. // UnmarshalJSON implements the json.Unmarshaler interface.
func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error {
if string(decimalBytes) == "null" {
return nil
}
str, err := unquoteIfQuoted(decimalBytes) str, err := unquoteIfQuoted(decimalBytes)
if err != nil { if err != nil {
return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err) return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err)

View file

@ -231,7 +231,6 @@ func TestNewFromFloatWithExponent(t *testing.T) {
} }
} }
func TestNewFromBigIntWithExponent(t *testing.T) { func TestNewFromBigIntWithExponent(t *testing.T) {
type Inp struct { type Inp struct {
val *big.Int val *big.Int
@ -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) { func TestBadJSON(t *testing.T) {
for _, testCase := range []string{ for _, testCase := range []string{
"]o_o[", "]o_o[",