From a8b1550e7e753083e474fc0b6939e8e63a698b2e Mon Sep 17 00:00:00 2001 From: Eric Cochran Date: Mon, 27 Nov 2017 15:33:03 -0800 Subject: [PATCH] Make selectString consistent across JsonReaders. (#399) Make JsonValueReader.selectString return -1 for non-strings instead of throwing. --- .../java/com/squareup/moshi/JsonValueReader.java | 13 +++++++++++-- .../java/com/squareup/moshi/JsonReaderTest.java | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java b/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java index ebc5ff4..57f5c76 100644 --- a/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java +++ b/moshi/src/main/java/com/squareup/moshi/JsonValueReader.java @@ -168,9 +168,18 @@ final class JsonValueReader extends JsonReader { } @Override public int selectString(Options options) throws IOException { - String peeked = require(String.class, Token.STRING); + Object peeked = (stackSize != 0 ? stack[stackSize - 1] : null); + + if (!(peeked instanceof String)) { + if (peeked == JSON_READER_CLOSED) { + throw new IllegalStateException("JsonReader is closed"); + } + return -1; + } + String peekedString = (String) peeked; + for (int i = 0, length = options.strings.length; i < length; i++) { - if (options.strings[i].equals(peeked)) { + if (options.strings[i].equals(peekedString)) { remove(); return i; } diff --git a/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java b/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java index dbb0d62..d656998 100644 --- a/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java +++ b/moshi/src/test/java/com/squareup/moshi/JsonReaderTest.java @@ -852,6 +852,21 @@ public final class JsonReaderTest { reader.endArray(); } + @Test public void selectStringWithoutString() throws IOException { + JsonReader.Options numbers = JsonReader.Options.of("1", "2.0", "true", "4"); + + JsonReader reader = newReader("[0, 2.0, true, \"4\"]"); + reader.beginArray(); + assertThat(reader.selectString(numbers)).isEqualTo(-1); + reader.skipValue(); + assertThat(reader.selectString(numbers)).isEqualTo(-1); + reader.skipValue(); + assertThat(reader.selectString(numbers)).isEqualTo(-1); + reader.skipValue(); + assertThat(reader.selectString(numbers)).isEqualTo(3); + reader.endArray(); + } + @Test public void stringToNumberCoersion() throws Exception { JsonReader reader = newReader("[\"0\", \"9223372036854775807\", \"1.5\"]"); reader.beginArray();