Make selectString consistent across JsonReaders. (#399)

Make JsonValueReader.selectString return -1 for non-strings instead of throwing.
This commit is contained in:
Eric Cochran
2017-11-27 15:33:03 -08:00
committed by GitHub
parent 20ffd22110
commit a8b1550e7e
2 changed files with 26 additions and 2 deletions

View File

@@ -168,9 +168,18 @@ final class JsonValueReader extends JsonReader {
} }
@Override public int selectString(Options options) throws IOException { @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++) { for (int i = 0, length = options.strings.length; i < length; i++) {
if (options.strings[i].equals(peeked)) { if (options.strings[i].equals(peekedString)) {
remove(); remove();
return i; return i;
} }

View File

@@ -852,6 +852,21 @@ public final class JsonReaderTest {
reader.endArray(); 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 { @Test public void stringToNumberCoersion() throws Exception {
JsonReader reader = newReader("[\"0\", \"9223372036854775807\", \"1.5\"]"); JsonReader reader = newReader("[\"0\", \"9223372036854775807\", \"1.5\"]");
reader.beginArray(); reader.beginArray();