Always provide line and column information when a parse fails.
This commit is contained in:
parent
8e8bf934f9
commit
40cd660115
|
@ -336,7 +336,8 @@ public class JsonReader implements Closeable {
|
||||||
private void expect(JsonToken expected) throws IOException {
|
private void expect(JsonToken expected) throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != expected) {
|
if (token != expected) {
|
||||||
throw new IllegalStateException("Expected " + expected + " but was " + peek());
|
throw new IllegalStateException("Expected " + expected + " but was " + peek()
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
advance();
|
advance();
|
||||||
}
|
}
|
||||||
|
@ -365,8 +366,8 @@ public class JsonReader implements Closeable {
|
||||||
stack[stackSize - 1] = JsonScope.NONEMPTY_DOCUMENT;
|
stack[stackSize - 1] = JsonScope.NONEMPTY_DOCUMENT;
|
||||||
JsonToken firstToken = nextValue();
|
JsonToken firstToken = nextValue();
|
||||||
if (!lenient && token != JsonToken.BEGIN_ARRAY && token != JsonToken.BEGIN_OBJECT) {
|
if (!lenient && token != JsonToken.BEGIN_ARRAY && token != JsonToken.BEGIN_OBJECT) {
|
||||||
throw new IOException(
|
throw new IOException("Expected JSON document to start with '[' or '{' but was " + token
|
||||||
"Expected JSON document to start with '[' or '{' but was " + token);
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
return firstToken;
|
return firstToken;
|
||||||
case EMPTY_ARRAY:
|
case EMPTY_ARRAY:
|
||||||
|
@ -441,7 +442,8 @@ public class JsonReader implements Closeable {
|
||||||
public String nextName() throws IOException {
|
public String nextName() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.NAME) {
|
if (token != JsonToken.NAME) {
|
||||||
throw new IllegalStateException("Expected a name but was " + peek());
|
throw new IllegalStateException("Expected a name but was " + peek()
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
String result = name;
|
String result = name;
|
||||||
advance();
|
advance();
|
||||||
|
@ -459,7 +461,8 @@ public class JsonReader implements Closeable {
|
||||||
public String nextString() throws IOException {
|
public String nextString() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
||||||
throw new IllegalStateException("Expected a string but was " + peek());
|
throw new IllegalStateException("Expected a string but was " + peek()
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
String result = value;
|
String result = value;
|
||||||
|
@ -477,7 +480,8 @@ public class JsonReader implements Closeable {
|
||||||
public boolean nextBoolean() throws IOException {
|
public boolean nextBoolean() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.BOOLEAN) {
|
if (token != JsonToken.BOOLEAN) {
|
||||||
throw new IllegalStateException("Expected a boolean but was " + token);
|
throw new IllegalStateException("Expected a boolean but was " + token
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean result = (value == TRUE);
|
boolean result = (value == TRUE);
|
||||||
|
@ -495,7 +499,8 @@ public class JsonReader implements Closeable {
|
||||||
public void nextNull() throws IOException {
|
public void nextNull() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.NULL) {
|
if (token != JsonToken.NULL) {
|
||||||
throw new IllegalStateException("Expected null but was " + token);
|
throw new IllegalStateException("Expected null but was " + token
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
advance();
|
advance();
|
||||||
|
@ -513,16 +518,19 @@ public class JsonReader implements Closeable {
|
||||||
public double nextDouble() throws IOException {
|
public double nextDouble() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
||||||
throw new IllegalStateException("Expected a double but was " + token);
|
throw new IllegalStateException("Expected a double but was " + token
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
double result = Double.parseDouble(value);
|
double result = Double.parseDouble(value);
|
||||||
|
|
||||||
if ((result >= 1.0d && value.startsWith("0"))) {
|
if ((result >= 1.0d && value.startsWith("0"))) {
|
||||||
throw new MalformedJsonException("JSON forbids octal prefixes: " + value);
|
throw new MalformedJsonException("JSON forbids octal prefixes: " + value
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
if (!lenient && (Double.isNaN(result) || Double.isInfinite(result))) {
|
if (!lenient && (Double.isNaN(result) || Double.isInfinite(result))) {
|
||||||
throw new MalformedJsonException("JSON forbids NaN and infinities: " + value);
|
throw new MalformedJsonException("JSON forbids NaN and infinities: " + value
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
advance();
|
advance();
|
||||||
|
@ -542,7 +550,8 @@ public class JsonReader implements Closeable {
|
||||||
public long nextLong() throws IOException {
|
public long nextLong() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
||||||
throw new IllegalStateException("Expected a long but was " + token);
|
throw new IllegalStateException("Expected a long but was " + token
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
long result;
|
long result;
|
||||||
|
@ -552,12 +561,14 @@ public class JsonReader implements Closeable {
|
||||||
double asDouble = Double.parseDouble(value); // don't catch this NumberFormatException
|
double asDouble = Double.parseDouble(value); // don't catch this NumberFormatException
|
||||||
result = (long) asDouble;
|
result = (long) asDouble;
|
||||||
if (result != asDouble) {
|
if (result != asDouble) {
|
||||||
throw new NumberFormatException(value);
|
throw new NumberFormatException("Expected a long but was " + value
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result >= 1L && value.startsWith("0")) {
|
if (result >= 1L && value.startsWith("0")) {
|
||||||
throw new MalformedJsonException("JSON forbids octal prefixes: " + value);
|
throw new MalformedJsonException("JSON forbids octal prefixes: " + value
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
advance();
|
advance();
|
||||||
|
@ -577,7 +588,8 @@ public class JsonReader implements Closeable {
|
||||||
public int nextInt() throws IOException {
|
public int nextInt() throws IOException {
|
||||||
peek();
|
peek();
|
||||||
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
|
||||||
throw new IllegalStateException("Expected an int but was " + token);
|
throw new IllegalStateException("Expected an int but was " + token
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
|
@ -587,12 +599,14 @@ public class JsonReader implements Closeable {
|
||||||
double asDouble = Double.parseDouble(value); // don't catch this NumberFormatException
|
double asDouble = Double.parseDouble(value); // don't catch this NumberFormatException
|
||||||
result = (int) asDouble;
|
result = (int) asDouble;
|
||||||
if (result != asDouble) {
|
if (result != asDouble) {
|
||||||
throw new NumberFormatException(value);
|
throw new NumberFormatException("Expected an int but was " + value
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result >= 1L && value.startsWith("0")) {
|
if (result >= 1L && value.startsWith("0")) {
|
||||||
throw new MalformedJsonException("JSON forbids octal prefixes: " + value);
|
throw new MalformedJsonException("JSON forbids octal prefixes: " + value
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
advance();
|
advance();
|
||||||
|
@ -891,7 +905,8 @@ public class JsonReader implements Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (throwOnEof) {
|
if (throwOnEof) {
|
||||||
throw new EOFException("End of input");
|
throw new EOFException("End of input"
|
||||||
|
+ " at line " + getLineNumber() + " column " + getColumnNumber());
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1244,7 +1259,7 @@ public class JsonReader implements Closeable {
|
||||||
reader.peek();
|
reader.peek();
|
||||||
if (reader.token != JsonToken.NAME) {
|
if (reader.token != JsonToken.NAME) {
|
||||||
throw new IllegalStateException("Expected a name but was " + reader.peek() + " "
|
throw new IllegalStateException("Expected a name but was " + reader.peek() + " "
|
||||||
+ reader.getSnippet());
|
+ " at line " + reader.getLineNumber() + " column " + reader.getColumnNumber());
|
||||||
}
|
}
|
||||||
reader.value = reader.name;
|
reader.value = reader.name;
|
||||||
reader.name = null;
|
reader.name = null;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user