From 02cf66f129bcb2db2f1531aadb72c2df9465678c Mon Sep 17 00:00:00 2001 From: Jesse Wilson Date: Sat, 26 Oct 2019 22:57:00 -0400 Subject: [PATCH] Specify precedence when a subtype has multiple labels --- .../PolymorphicJsonAdapterFactory.java | 3 ++- .../PolymorphicJsonAdapterFactoryTest.java | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java b/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java index be7e7fc..27527a3 100644 --- a/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java +++ b/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java @@ -100,7 +100,8 @@ import javax.annotation.Nullable; * *

If an unknown subtype is encountered when decoding, this will throw a {@link * JsonDataException}. If an unknown type is encountered when encoding, this will throw an {@link - * IllegalArgumentException}. + * IllegalArgumentException}. If the same subtype has multiple labels the first one is used when + * encoding. * *

If you want to specify a custom unknown fallback for decoding, you can do so via * {@link #withDefaultValue(Object)}. This instance should be immutable, as it is shared. diff --git a/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java b/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java index f0c0d0a..ffc479e 100644 --- a/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java +++ b/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java @@ -160,7 +160,7 @@ public final class PolymorphicJsonAdapterFactoryTest { assertThat(reader.peek()).isEqualTo(JsonReader.Token.END_DOCUMENT); } - @Test public void nonUniqueSubtypes() throws IOException { + @Test public void nonUniqueSubtypes() throws IOException { Moshi moshi = new Moshi.Builder() .add(PolymorphicJsonAdapterFactory.of(Message.class, "type") .withSubtype(Success.class, "success") @@ -168,14 +168,16 @@ public final class PolymorphicJsonAdapterFactoryTest { .withSubtype(Error.class, "error")) .build(); - JsonAdapter adapter = moshi.adapter(Message.class); + JsonAdapter adapter = moshi.adapter(Message.class); - assertThat(adapter.fromJson("{\"type\":\"success\",\"value\":\"Okay!\"}")) - .isEqualTo(new Success("Okay!")); - assertThat(adapter.fromJson("{\"type\":\"data\",\"value\":\"Data!\"}")) - .isEqualTo(new Success("Data!")); - assertThat(adapter.fromJson("{\"type\":\"error\",\"error_logs\":{\"order\":66}}")) - .isEqualTo(new Error(Collections.singletonMap("order", 66d))); + assertThat(adapter.fromJson("{\"type\":\"success\",\"value\":\"Okay!\"}")) + .isEqualTo(new Success("Okay!")); + assertThat(adapter.fromJson("{\"type\":\"data\",\"value\":\"Data!\"}")) + .isEqualTo(new Success("Data!")); + assertThat(adapter.fromJson("{\"type\":\"error\",\"error_logs\":{\"order\":66}}")) + .isEqualTo(new Error(Collections.singletonMap("order", 66d))); + assertThat(adapter.toJson(new Success("Data!"))) + .isEqualTo("{\"type\":\"success\",\"value\":\"Data!\"}"); } @Test public void uniqueLabels() {