From 1978581b3d70c58eea83629333eaad79e51e6903 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Wed, 11 Sep 2019 07:22:02 -0400 Subject: [PATCH] Make Rfc3339DateJsonAdapter null-safe (#910) * Move delegate to private final * Make Rfc3339DateJsonAdapter null-safe Resolves #723 --- .../squareup/moshi/Rfc3339DateJsonAdapter.java | 2 +- .../moshi/adapters/Rfc3339DateJsonAdapter.java | 15 +++++++++++---- .../adapters/Rfc3339DateJsonAdapterTest.java | 5 +++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/adapters/src/main/java/com/squareup/moshi/Rfc3339DateJsonAdapter.java b/adapters/src/main/java/com/squareup/moshi/Rfc3339DateJsonAdapter.java index 021e987..6b0086e 100644 --- a/adapters/src/main/java/com/squareup/moshi/Rfc3339DateJsonAdapter.java +++ b/adapters/src/main/java/com/squareup/moshi/Rfc3339DateJsonAdapter.java @@ -23,7 +23,7 @@ import java.util.Date; * The new class is {@code com.squareup.moshi.adapters.Rfc3339DateJsonAdapter}. */ public final class Rfc3339DateJsonAdapter extends JsonAdapter { - com.squareup.moshi.adapters.Rfc3339DateJsonAdapter delegate + private final com.squareup.moshi.adapters.Rfc3339DateJsonAdapter delegate = new com.squareup.moshi.adapters.Rfc3339DateJsonAdapter(); @Override public Date fromJson(JsonReader reader) throws IOException { diff --git a/adapters/src/main/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapter.java b/adapters/src/main/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapter.java index 4f790a2..b096627 100644 --- a/adapters/src/main/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapter.java +++ b/adapters/src/main/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapter.java @@ -23,8 +23,8 @@ import java.util.Date; /** * Formats dates using RFC 3339, which is - * formatted like {@code 2015-09-26T18:23:50.250Z}. To use, add this as an adapter for {@code - * Date.class} on your {@link com.squareup.moshi.Moshi.Builder Moshi.Builder}: + * formatted like {@code 2015-09-26T18:23:50.250Z}. This adapter is null-safe. To use, add this as + * an adapter for {@code Date.class} on your {@link com.squareup.moshi.Moshi.Builder Moshi.Builder}: * *
 {@code
  *
@@ -35,12 +35,19 @@ import java.util.Date;
  */
 public final class Rfc3339DateJsonAdapter extends JsonAdapter {
   @Override public synchronized Date fromJson(JsonReader reader) throws IOException {
+    if (reader.peek() == JsonReader.Token.NULL) {
+      return reader.nextNull();
+    }
     String string = reader.nextString();
     return Iso8601Utils.parse(string);
   }
 
   @Override public synchronized void toJson(JsonWriter writer, Date value) throws IOException {
-    String string = Iso8601Utils.format(value);
-    writer.value(string);
+    if (value == null) {
+      writer.nullValue();
+    } else {
+      String string = Iso8601Utils.format(value);
+      writer.value(string);
+    }
   }
 }
diff --git a/adapters/src/test/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapterTest.java b/adapters/src/test/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapterTest.java
index b450d90..5961a08 100644
--- a/adapters/src/test/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapterTest.java
+++ b/adapters/src/test/java/com/squareup/moshi/adapters/Rfc3339DateJsonAdapterTest.java
@@ -63,6 +63,11 @@ public final class Rfc3339DateJsonAdapterTest {
         .isEqualTo("\"1937-01-01T11:40:27.870Z\"");
   }
 
+  @Test public void nullSafety() throws Exception {
+    assertThat(adapter.toJson(null)).isEqualTo("null");
+    assertThat(adapter.fromJson("null")).isNull();
+  }
+
   private Date newDate(
       int year, int month, int day, int hour, int minute, int second, int millis, int offset) {
     Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));