Skip to content

Commit 6351460

Browse files
authored
Support fast double parser (#3475)
1 parent 96d80a4 commit 6351460

File tree

3 files changed

+95
-5
lines changed

3 files changed

+95
-5
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ protected final Float _parseFloat(JsonParser p, DeserializationContext ctxt)
645645
return (Float) getNullValue(ctxt);
646646
}
647647
try {
648-
return NumberInput.parseFloat(text);
648+
return NumberInput.parseFloat(text, p.isEnabled(JsonParser.Feature.USE_FAST_DOUBLE_PARSER));
649649
} catch (IllegalArgumentException iae) { }
650650
return (Float) ctxt.handleWeirdStringValue(_valueClass, text,
651651
"not a valid `Float` value");
@@ -736,7 +736,7 @@ protected final Double _parseDouble(JsonParser p, DeserializationContext ctxt) t
736736
return (Double) getNullValue(ctxt);
737737
}
738738
try {
739-
return _parseDouble(text);
739+
return _parseDouble(text, p.isEnabled(JsonParser.Feature.USE_FAST_DOUBLE_PARSER));
740740
} catch (IllegalArgumentException iae) { }
741741
return (Double) ctxt.handleWeirdStringValue(_valueClass, text,
742742
"not a valid `Double` value");

src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,10 +1157,24 @@ protected final double _parseDoublePrimitive(DeserializationContext ctxt, String
11571157
/**
11581158
* Helper method for encapsulating calls to low-level double value parsing; single place
11591159
* just because we need a work-around that must be applied to all calls.
1160+
* Does not use the new <code>useFastParser</code> support.
1161+
*
1162+
* @see #_parseDouble(String, boolean)
1163+
*/
1164+
protected final static double _parseDouble(final String numStr) throws NumberFormatException
1165+
{
1166+
return _parseDouble(numStr, false);
1167+
}
1168+
1169+
/**
1170+
* Helper method for encapsulating calls to low-level double value parsing; single place
1171+
* just because we need a work-around that must be applied to all calls.
1172+
*
1173+
* @since 2.14
11601174
*/
1161-
protected final static double _parseDouble(String numStr) throws NumberFormatException
1175+
protected final static double _parseDouble(final String numStr, final boolean useFastParser) throws NumberFormatException
11621176
{
1163-
return NumberInput.parseDouble(numStr);
1177+
return NumberInput.parseDouble(numStr, useFastParser);
11641178
}
11651179

11661180
/**

src/test/java/com/fasterxml/jackson/databind/seq/ReadValuesTest.java

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.fasterxml.jackson.databind.MappingIterator;
1111
import com.fasterxml.jackson.databind.ObjectMapper;
1212
import com.fasterxml.jackson.databind.ObjectReader;
13+
import com.fasterxml.jackson.databind.json.JsonMapper;
1314

1415
@SuppressWarnings("resource")
1516
public class ReadValuesTest extends BaseMapTest
@@ -307,7 +308,27 @@ public void testNonRootMapsWithObjectReader() throws Exception
307308
assertEquals(2, map.size());
308309
assertFalse(iterator.hasNext());
309310
}
310-
311+
312+
public void testObjectReaderWithJsonParserFastDoubleParser() throws Exception
313+
{
314+
testObjectReaderWithFastDoubleParser(true);
315+
}
316+
317+
public void testObjectReaderWithJsonReadFeatureFastDoubleParser() throws Exception
318+
{
319+
testObjectReaderWithFastDoubleParser(false);
320+
}
321+
322+
public void testObjectReaderWithJsonParserFastFloatParser() throws Exception
323+
{
324+
testObjectReaderWithFastFloatParser(true);
325+
}
326+
327+
public void testObjectReaderWithJsonReadFeatureFastFloatParser() throws Exception
328+
{
329+
testObjectReaderWithFastFloatParser(false);
330+
}
331+
311332
public void testNonRootArraysUsingParser() throws Exception
312333
{
313334
final String JSON = "[[1],[3]]";
@@ -342,4 +363,59 @@ public void testEmptyIterator() throws Exception
342363

343364
empty.close();
344365
}
366+
367+
private void testObjectReaderWithFastDoubleParser(final boolean useParserFeature) throws Exception
368+
{
369+
final String JSON = "[{ \"val1\": 1.23456, \"val2\": 5 }, { \"val1\": 3.14, \"val2\": -6.5 }]";
370+
final ObjectMapper mapper;
371+
if (useParserFeature) {
372+
JsonFactory factory = new JsonFactory();
373+
factory.enable(JsonParser.Feature.USE_FAST_DOUBLE_PARSER);
374+
mapper = JsonMapper.builder(factory).build();
375+
} else {
376+
mapper = JsonMapper.builder().enable(StreamReadFeature.USE_FAST_DOUBLE_PARSER).build();
377+
}
378+
379+
final MappingIterator<Map<String, Double>> iterator = mapper.reader().forType(new TypeReference<Map<String, Double>>(){}).readValues(JSON);
380+
381+
Map<String, Double> map;
382+
assertTrue(iterator.hasNext());
383+
map = iterator.nextValue();
384+
assertEquals(2, map.size());
385+
assertEquals(Double.valueOf(1.23456), map.get("val1"));
386+
assertEquals(Double.valueOf(5), map.get("val2"));
387+
assertTrue(iterator.hasNext());
388+
map = iterator.nextValue();
389+
assertEquals(Double.valueOf(3.14), map.get("val1"));
390+
assertEquals(Double.valueOf(-6.5), map.get("val2"));
391+
assertEquals(2, map.size());
392+
assertFalse(iterator.hasNext());
393+
}
394+
395+
private void testObjectReaderWithFastFloatParser(final boolean useParserFeature) throws Exception
396+
{
397+
final String JSON = "[{ \"val1\": 1.23456, \"val2\": 5 }, { \"val1\": 3.14, \"val2\": -6.5 }]";
398+
final ObjectMapper mapper;
399+
if (useParserFeature) {
400+
JsonFactory factory = new JsonFactory();
401+
factory.enable(JsonParser.Feature.USE_FAST_DOUBLE_PARSER);
402+
mapper = JsonMapper.builder(factory).build();
403+
} else {
404+
mapper = JsonMapper.builder().enable(StreamReadFeature.USE_FAST_DOUBLE_PARSER).build();
405+
}
406+
final MappingIterator<Map<String, Float>> iterator = mapper.reader().forType(new TypeReference<Map<String, Float>>(){}).readValues(JSON);
407+
408+
Map<String, Float> map;
409+
assertTrue(iterator.hasNext());
410+
map = iterator.nextValue();
411+
assertEquals(2, map.size());
412+
assertEquals(Float.valueOf(1.23456f), map.get("val1"));
413+
assertEquals(Float.valueOf(5), map.get("val2"));
414+
assertTrue(iterator.hasNext());
415+
map = iterator.nextValue();
416+
assertEquals(Float.valueOf(3.14f), map.get("val1"));
417+
assertEquals(Float.valueOf(-6.5f), map.get("val2"));
418+
assertEquals(2, map.size());
419+
assertFalse(iterator.hasNext());
420+
}
345421
}

0 commit comments

Comments
 (0)