diff --git a/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java b/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java index f6384cf860..cff91e9e59 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java +++ b/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java @@ -274,6 +274,10 @@ public long nextLong() throws IOException { long result; try { result = primitive.getAsLong(); + if (token == JsonToken.NUMBER && result != primitive.getAsDouble()) { + // Mirror JsonReader: reject numbers that cannot be exactly represented as a long + throw new NumberFormatException("Expected a long but was " + primitive.getAsString()); + } } catch (NumberFormatException e) { throw numberFormatException("Expected a long but was " + primitive.getAsString(), e); } @@ -298,6 +302,10 @@ public int nextInt() throws IOException { int result; try { result = primitive.getAsInt(); + if (token == JsonToken.NUMBER && result != primitive.getAsDouble()) { + // Mirror JsonReader: reject numbers that cannot be exactly represented as an int + throw new NumberFormatException("Expected an int but was " + primitive.getAsString()); + } } catch (NumberFormatException e) { throw numberFormatException("Expected an int but was " + primitive.getAsString(), e); }