diff --git a/adapters/src/main/java/com/squareup/moshi/adapters/EnumJsonAdapter.java b/adapters/src/main/java/com/squareup/moshi/adapters/EnumJsonAdapter.java index bc06baf..359ddce 100644 --- a/adapters/src/main/java/com/squareup/moshi/adapters/EnumJsonAdapter.java +++ b/adapters/src/main/java/com/squareup/moshi/adapters/EnumJsonAdapter.java @@ -19,10 +19,11 @@ public final class EnumJsonAdapter> extends JsonAdapter { final String[] nameStrings; final T[] constants; final JsonReader.Options options; + final boolean useFallbackValue; final @Nullable T fallbackValue; public static > EnumJsonAdapter create(Class enumType) { - return new EnumJsonAdapter<>(enumType, null); + return new EnumJsonAdapter<>(enumType, null, false); } /** @@ -31,16 +32,14 @@ public final class EnumJsonAdapter> extends JsonAdapter { * null, absent, or not a string. Also, the string values are case-sensitive, and this fallback * value will be used even on case mismatches. */ - public EnumJsonAdapter withUnknownFallback(T fallbackValue) { - if (fallbackValue == null) { - throw new NullPointerException("fallbackValue == null"); - } - return new EnumJsonAdapter<>(enumType, fallbackValue); + public EnumJsonAdapter withUnknownFallback(@Nullable T fallbackValue) { + return new EnumJsonAdapter<>(enumType, fallbackValue, true); } - EnumJsonAdapter(Class enumType, @Nullable T fallbackValue) { + EnumJsonAdapter(Class enumType, @Nullable T fallbackValue, boolean useFallbackValue) { this.enumType = enumType; this.fallbackValue = fallbackValue; + this.useFallbackValue = useFallbackValue; try { constants = enumType.getEnumConstants(); nameStrings = new String[constants.length]; @@ -61,7 +60,7 @@ public final class EnumJsonAdapter> extends JsonAdapter { if (index != -1) return constants[index]; String path = reader.getPath(); - if (fallbackValue == null) { + if (!useFallbackValue) { String name = reader.nextString(); throw new JsonDataException("Expected one of " + Arrays.asList(nameStrings) + " but was " + name + " at path " + path); diff --git a/adapters/src/test/java/com/squareup/moshi/adapters/EnumJsonAdapterTest.java b/adapters/src/test/java/com/squareup/moshi/adapters/EnumJsonAdapterTest.java index 09c7816..2ccb9ec 100644 --- a/adapters/src/test/java/com/squareup/moshi/adapters/EnumJsonAdapterTest.java +++ b/adapters/src/test/java/com/squareup/moshi/adapters/EnumJsonAdapterTest.java @@ -44,6 +44,14 @@ public final class EnumJsonAdapterTest { assertThat(reader.peek()).isEqualTo(JsonReader.Token.END_DOCUMENT); } + @Test public void withNullFallbackValue() throws Exception { + EnumJsonAdapter adapter = EnumJsonAdapter.create(Roshambo.class) + .withUnknownFallback(null); + JsonReader reader = JsonReader.of(new Buffer().writeUtf8("\"SPOCK\"")); + assertThat(adapter.fromJson(reader)).isNull(); + assertThat(reader.peek()).isEqualTo(JsonReader.Token.END_DOCUMENT); + } + enum Roshambo { ROCK, PAPER,