jsonpb: treat `null` JSON values for `Timestamp` and `Duration` as defaults (#255)
* Handle unmarshalling of null json values for timestamp and duration types
* Add tests for json values that include nulls for timestamp and duration
diff --git a/jsonpb/jsonpb.go b/jsonpb/jsonpb.go
index 1fc8ae8..82c6162 100644
--- a/jsonpb/jsonpb.go
+++ b/jsonpb/jsonpb.go
@@ -585,7 +585,14 @@
case "Any":
return fmt.Errorf("unmarshaling Any not supported yet")
case "Duration":
- unq, err := strconv.Unquote(string(inputValue))
+ ivStr := string(inputValue)
+ if ivStr == "null" {
+ target.Field(0).SetInt(0)
+ target.Field(1).SetInt(0)
+ return nil
+ }
+
+ unq, err := strconv.Unquote(ivStr)
if err != nil {
return err
}
@@ -600,7 +607,14 @@
target.Field(1).SetInt(ns)
return nil
case "Timestamp":
- unq, err := strconv.Unquote(string(inputValue))
+ ivStr := string(inputValue)
+ if ivStr == "null" {
+ target.Field(0).SetInt(0)
+ target.Field(1).SetInt(0)
+ return nil
+ }
+
+ unq, err := strconv.Unquote(ivStr)
if err != nil {
return err
}
diff --git a/jsonpb/jsonpb_test.go b/jsonpb/jsonpb_test.go
index 78f67c4..e237df5 100644
--- a/jsonpb/jsonpb_test.go
+++ b/jsonpb/jsonpb_test.go
@@ -467,9 +467,11 @@
{"camelName input", Unmarshaler{}, `{"oBool":true}`, &pb.Simple{OBool: proto.Bool(true)}},
{"Duration", Unmarshaler{}, `{"dur":"3.000s"}`, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}},
+ {"null Duration", Unmarshaler{}, `{"dur":null}`, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 0}}},
{"Timestamp", Unmarshaler{}, `{"ts":"2014-05-13T16:53:20.021Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}},
{"PreEpochTimestamp", Unmarshaler{}, `{"ts":"1969-12-31T23:59:58.999999995Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -2, Nanos: 999999995}}},
{"ZeroTimeTimestamp", Unmarshaler{}, `{"ts":"0001-01-01T00:00:00Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -62135596800, Nanos: 0}}},
+ {"null Timestamp", Unmarshaler{}, `{"ts":null}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 0, Nanos: 0}}},
{"DoubleValue", Unmarshaler{}, `{"dbl":1.2}`, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}},
{"FloatValue", Unmarshaler{}, `{"flt":1.2}`, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}},