From 6fe9ae0793cd0ede1681912321975d9c0b65207d Mon Sep 17 00:00:00 2001 From: Liang-Chi Hsieh Date: Mon, 23 May 2016 04:55:23 +0000 Subject: [PATCH] Support INF. --- .../core/json/ReaderBasedJsonParser.java | 19 ++++++++++++++++--- .../core/json/UTF8DataInputJsonParser.java | 14 +++++++++++--- .../core/json/UTF8StreamJsonParser.java | 19 ++++++++++++++++--- .../read/NonStandardParserFeaturesTest.java | 9 ++++++++- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java index c7be7507d7..96909d040e 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java @@ -1870,11 +1870,24 @@ protected JsonToken _handleOddValue(int i) throws IOException _reportError("Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); break; case 'I': - _matchToken("Infinity", 1); + if (_inputPtr >= _inputEnd) { + if (!_loadMore()) { + _reportInvalidEOFInValue(); + } + } + + String match = null; + if (_inputBuffer[_inputPtr] == 'n') { + _matchToken("Infinity", 1); + match = "Infinity"; + } else { + _matchToken("INF", 1); + match = "INF"; + } if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) { - return resetAsNaN("Infinity", Double.POSITIVE_INFINITY); + return resetAsNaN(match, Double.POSITIVE_INFINITY); } - _reportError("Non-standard token 'Infinity': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); + _reportError("Non-standard token '"+match+"': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); break; case '+': // note: '-' is taken as number if (_inputPtr >= _inputEnd) { diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8DataInputJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8DataInputJsonParser.java index 6f8dc78aac..118afaa5ae 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/UTF8DataInputJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8DataInputJsonParser.java @@ -2025,11 +2025,19 @@ protected JsonToken _handleUnexpectedValue(int c) _reportError("Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); break; case 'I': - _matchToken("Infinity", 1); + String match = null; + int nextChar = _inputData.readUnsignedByte(); + if (nextChar == 'n') { + _matchToken("Infinity", 2); + match = "Infinity"; + } else { + _matchToken("INF", 2); + match = "INF"; + } if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) { - return resetAsNaN("Infinity", Double.POSITIVE_INFINITY); + return resetAsNaN(match, Double.POSITIVE_INFINITY); } - _reportError("Non-standard token 'Infinity': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); + _reportError("Non-standard token '"+match+"': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); break; case '+': // note: '-' is taken as number return _handleInvalidNumberStart(_inputData.readUnsignedByte(), false); diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java index de6e43f72d..d064ce7432 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java @@ -2664,11 +2664,24 @@ protected JsonToken _handleUnexpectedValue(int c) _reportError("Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); break; case 'I': - _matchToken("Infinity", 1); + if (_inputPtr >= _inputEnd) { + if (!_loadMore()) { + _reportInvalidEOFInValue(); + } + } + + String match = null; + if (_inputBuffer[_inputPtr] == 'n') { + _matchToken("Infinity", 1); + match = "Infinity"; + } else { + _matchToken("INF", 1); + match = "INF"; + } if (isEnabled(Feature.ALLOW_NON_NUMERIC_NUMBERS)) { - return resetAsNaN("Infinity", Double.POSITIVE_INFINITY); + return resetAsNaN(match, Double.POSITIVE_INFINITY); } - _reportError("Non-standard token 'Infinity': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); + _reportError("Non-standard token '"+match+"': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow"); break; case '+': // note: '-' is taken as number if (_inputPtr >= _inputEnd) { diff --git a/src/test/java/com/fasterxml/jackson/core/read/NonStandardParserFeaturesTest.java b/src/test/java/com/fasterxml/jackson/core/read/NonStandardParserFeaturesTest.java index b26c46e943..ddddb94455 100644 --- a/src/test/java/com/fasterxml/jackson/core/read/NonStandardParserFeaturesTest.java +++ b/src/test/java/com/fasterxml/jackson/core/read/NonStandardParserFeaturesTest.java @@ -468,7 +468,7 @@ private void _testAllowNaN(int mode) throws Exception private void _testAllowInf(int mode) throws Exception { - final String JSON = "[ -INF, +INF, +Infinity, Infinity, -Infinity ]"; + final String JSON = "[ -INF, +INF, INF, +Infinity, Infinity, -Infinity ]"; JsonFactory f = new JsonFactory(); assertFalse(f.isEnabled(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS)); @@ -499,6 +499,12 @@ private void _testAllowInf(int mode) throws Exception assertTrue(Double.isInfinite(d)); assertTrue(d == Double.POSITIVE_INFINITY); + assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken()); + d = p.getDoubleValue(); + assertEquals("INF", p.getText()); + assertTrue(Double.isInfinite(d)); + assertTrue(d == Double.POSITIVE_INFINITY); + assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken()); d = p.getDoubleValue(); assertEquals("+Infinity", p.getText()); @@ -530,6 +536,7 @@ private void _testAllowInf(int mode) throws Exception assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken()); assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken()); assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken()); + assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken()); assertToken(JsonToken.END_ARRAY, p.nextToken()); p.close();