From 12d37ffdc35d985287ce0badb1cf9a5d2a6f50f6 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Thu, 26 Sep 2019 20:36:31 -0400 Subject: [PATCH] Point at the offending name when failing on unknown --- .../java/com/squareup/moshi/JsonUtf8Reader.java | 5 ++++- .../java/com/squareup/moshi/JsonValueReader.java | 5 ++++- .../java/com/squareup/moshi/JsonReaderTest.java | 14 ++++++++++++++ .../test/java/com/squareup/moshi/MoshiTest.java | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/moshi/src/main/java/com/squareup/moshi/JsonUtf8Reader.java b/moshi/src/main/java/com/squareup/moshi/JsonUtf8Reader.java index f5f9d3e..70e48a8 100644 --- a/moshi/src/main/java/com/squareup/moshi/JsonUtf8Reader.java +++ b/moshi/src/main/java/com/squareup/moshi/JsonUtf8Reader.java @@ -586,7 +586,10 @@ final class JsonUtf8Reader extends JsonReader { @Override public void skipName() throws IOException { if (failOnUnknown) { - throw new JsonDataException("Cannot skip unexpected " + peek() + " at " + getPath()); + // Capture the peeked value before nextName() since it will reset its value. + Token peeked = peek(); + nextName(); // Move the path forward onto the offending name. + throw new JsonDataException("Cannot skip unexpected " + peeked + " at " + getPath()); } int p = peeked; if (p == PEEKED_NONE) { diff --git a/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java b/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java index 7b3f801..df1d66b 100644 --- a/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java +++ b/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java @@ -167,7 +167,10 @@ final class JsonValueReader extends JsonReader { @Override public void skipName() throws IOException { if (failOnUnknown) { - throw new JsonDataException("Cannot skip unexpected " + peek() + " at " + getPath()); + // Capture the peeked value before nextName() since it will reset its value. + Token peeked = peek(); + nextName(); // Move the path forward onto the offending name. + throw new JsonDataException("Cannot skip unexpected " + peeked + " at " + getPath()); } Map.Entry peeked = require(Map.Entry.class, Token.NAME); diff --git a/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java b/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java index eeb27a3..c07a8e6 100644 --- a/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java +++ b/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java @@ -972,6 +972,20 @@ public final class JsonReaderTest { reader.endObject(); } + @Test public void skipNameFailUnknown() throws IOException { + JsonReader reader = newReader("{\"a\":1,\"b\":2}"); + reader.setFailOnUnknown(true); + reader.beginObject(); + assertEquals("a", reader.nextName()); + assertEquals(1, reader.nextInt()); + try { + reader.skipName(); + fail(); + } catch (JsonDataException e) { + assertThat(e).hasMessage("Cannot skip unexpected NAME at $.b"); + } + } + @Test public void skipNameOnValueFails() throws IOException { JsonReader reader = newReader("1"); try { diff --git a/moshi/src/test/java/com/squareup/moshi/MoshiTest.java b/moshi/src/test/java/com/squareup/moshi/MoshiTest.java index 11337d9..1d51689 100644 --- a/moshi/src/test/java/com/squareup/moshi/MoshiTest.java +++ b/moshi/src/test/java/com/squareup/moshi/MoshiTest.java @@ -925,7 +925,7 @@ public final class MoshiTest { adapter.fromJson("{\"diameter\":5,\"crust\":\"thick\",\"extraCheese\":true}"); fail(); } catch (JsonDataException expected) { - assertThat(expected).hasMessage("Cannot skip unexpected NAME at $.diameter"); + assertThat(expected).hasMessage("Cannot skip unexpected NAME at $.crust"); } }