diff --git a/gson/src/main/java/com/google/gson/stream/JsonReader.java b/gson/src/main/java/com/google/gson/stream/JsonReader.java index cd2ab47a..80bb923d 100644 --- a/gson/src/main/java/com/google/gson/stream/JsonReader.java +++ b/gson/src/main/java/com/google/gson/stream/JsonReader.java @@ -658,7 +658,7 @@ public class JsonReader implements Closeable { } if (c == -1 || !isLiteral((char) c)) { - if (fitsInLong) { + if (fitsInLong && (integer != Long.MIN_VALUE || negative)) { peekedInteger = negative ? integer : -integer; pos += i; return peeked = PEEKED_INTEGER; diff --git a/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java b/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java index 81df7565..cbed40cd 100644 --- a/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java +++ b/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java @@ -454,6 +454,22 @@ public final class JsonReaderTest extends TestCase { } } + /** + * This test fails because there's no double for 9223372036854775808, and our + * long parsing uses Double.parseDouble() for fractional values. + */ + public void testPeekLargerThanLongMaxValue() throws IOException { + JsonReader reader = new JsonReader(new StringReader("[9223372036854775808]")); + reader.setLenient(true); + reader.beginArray(); + assertEquals(NUMBER, reader.peek()); + try { + reader.nextLong(); + fail(); + } catch (NumberFormatException e) { + } + } + /** * This test fails because there's no double for -9223372036854775809, and our * long parsing uses Double.parseDouble() for fractional values.