From 4ec773178f8a992f9750ec4e7a57d2839530a075 Mon Sep 17 00:00:00 2001 From: Eric Cochran Date: Tue, 24 Jan 2017 17:33:52 -0800 Subject: [PATCH] Add failOnUnknown to MoshiConverterFactory --- .../moshi/MoshiConverterFactory.java | 27 ++++++++++++++----- .../moshi/MoshiConverterFactoryTest.java | 19 +++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/retrofit-converters/moshi/src/main/java/retrofit2/converter/moshi/MoshiConverterFactory.java b/retrofit-converters/moshi/src/main/java/retrofit2/converter/moshi/MoshiConverterFactory.java index 60e5f1bf..0b95d195 100644 --- a/retrofit-converters/moshi/src/main/java/retrofit2/converter/moshi/MoshiConverterFactory.java +++ b/retrofit-converters/moshi/src/main/java/retrofit2/converter/moshi/MoshiConverterFactory.java @@ -51,27 +51,37 @@ public final class MoshiConverterFactory extends Converter.Factory { /** Create an instance using {@code moshi} for conversion. */ public static MoshiConverterFactory create(Moshi moshi) { if (moshi == null) throw new NullPointerException("moshi == null"); - return new MoshiConverterFactory(moshi, false, false); + return new MoshiConverterFactory(moshi, false, false, false); } private final Moshi moshi; private final boolean lenient; + private final boolean failOnUnknown; private final boolean serializeNulls; - private MoshiConverterFactory(Moshi moshi, boolean lenient, boolean serializeNulls) { + private MoshiConverterFactory(Moshi moshi, boolean lenient, boolean failOnUnknown, + boolean serializeNulls) { this.moshi = moshi; this.lenient = lenient; + this.failOnUnknown = failOnUnknown; this.serializeNulls = serializeNulls; } /** Return a new factory which uses {@linkplain JsonAdapter#lenient() lenient} adapters. */ public MoshiConverterFactory asLenient() { - return new MoshiConverterFactory(moshi, true, serializeNulls); + return new MoshiConverterFactory(moshi, true, failOnUnknown, serializeNulls); + } + + /** + * Return a new factory which uses {@link JsonAdapter#failOnUnknown()} adapters. + */ + public MoshiConverterFactory failOnUnknown() { + return new MoshiConverterFactory(moshi, lenient, true, serializeNulls); } /** Return a new factory which includes null values into the serialized JSON. */ public MoshiConverterFactory withNullSerialization() { - return new MoshiConverterFactory(moshi, lenient, true); + return new MoshiConverterFactory(moshi, lenient, failOnUnknown, true); } @Override @@ -81,16 +91,21 @@ public final class MoshiConverterFactory extends Converter.Factory { if (lenient) { adapter = adapter.lenient(); } + if (failOnUnknown) { + adapter = adapter.failOnUnknown(); + } return new MoshiResponseBodyConverter<>(adapter); } - @Override - public Converter requestBodyConverter(Type type, + @Override public Converter requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { JsonAdapter adapter = moshi.adapter(type, jsonAnnotations(parameterAnnotations)); if (lenient) { adapter = adapter.lenient(); } + if (failOnUnknown) { + adapter = adapter.failOnUnknown(); + } return new MoshiRequestBodyConverter<>(adapter, serializeNulls); } diff --git a/retrofit-converters/moshi/src/test/java/retrofit2/converter/moshi/MoshiConverterFactoryTest.java b/retrofit-converters/moshi/src/test/java/retrofit2/converter/moshi/MoshiConverterFactoryTest.java index d22c3726..09da22e4 100644 --- a/retrofit-converters/moshi/src/test/java/retrofit2/converter/moshi/MoshiConverterFactoryTest.java +++ b/retrofit-converters/moshi/src/test/java/retrofit2/converter/moshi/MoshiConverterFactoryTest.java @@ -17,6 +17,7 @@ package retrofit2.converter.moshi; import com.squareup.moshi.FromJson; import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.JsonDataException; import com.squareup.moshi.JsonQualifier; import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; @@ -120,6 +121,7 @@ public final class MoshiConverterFactoryTest { private Service service; private Service serviceLenient; private Service serviceNulls; + private Service serviceFailOnUnknown; @Before public void setUp() { Moshi moshi = new Moshi.Builder() @@ -139,6 +141,7 @@ public final class MoshiConverterFactoryTest { MoshiConverterFactory factory = MoshiConverterFactory.create(moshi); MoshiConverterFactory factoryLenient = factory.asLenient(); MoshiConverterFactory factoryNulls = factory.withNullSerialization(); + MoshiConverterFactory factoryFailOnUnknown = factory.failOnUnknown(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(server.url("/")) .addConverterFactory(factory) @@ -151,9 +154,14 @@ public final class MoshiConverterFactoryTest { .baseUrl(server.url("/")) .addConverterFactory(factoryNulls) .build(); + Retrofit retrofitFailOnUnknown = new Retrofit.Builder() + .baseUrl(server.url("/")) + .addConverterFactory(factoryFailOnUnknown) + .build(); service = retrofit.create(Service.class); serviceLenient = retrofitLenient.create(Service.class); serviceNulls = retrofitNulls.create(Service.class); + serviceFailOnUnknown = retrofitFailOnUnknown.create(Service.class); } @Test public void anInterface() throws IOException, InterruptedException { @@ -222,6 +230,17 @@ public final class MoshiConverterFactoryTest { assertEquals("{\"theName\":null}", server.takeRequest().getBody().readUtf8()); } + @Test public void failOnUnknown() throws IOException, InterruptedException { + server.enqueue(new MockResponse().setBody("{\"taco\":\"delicious\"}")); + + Call call = serviceFailOnUnknown.anImplementation(new AnImplementation(null)); + try { + call.execute(); + } catch (JsonDataException e) { + assertThat(e).hasMessage("Cannot skip unexpected STRING at $.taco"); + } + } + @Test public void utf8BomSkipped() throws IOException { Buffer responseBody = new Buffer() .write(ByteString.decodeHex("EFBBBF")) -- GitLab