While developing how to dynamically parse JSON in HashMaps and ArrayLists today in high demand scenario, I came across ObjectMapper answer here.
I'm not sure what the internal devices do, but I found that it is on average about 20 times slower for my use case than a simple recursive analysis method that uses only jackson-core . Perhaps I am missing something else that the library picks up?
For reference, this is with jackson-core-2.9.9 running on Windows Server 2016, OpenJDK Java 11:
Execution 1
ObjectMapper: 1042ms
Kernel: 54 ms
19.29 times faster
Execution 2
ObjectMapper: 760ms
Kernel: 40 ms
19.00 times faster
Execution 3
ObjectMapper: 1000 ms
Core: 45 ms
22.22 times faster
Execution 4
ObjectMapper: 953ms
Kernel: 52 ms
18.32 times faster
Execution 5
ObjectMapper: 1017ms
Kernel: 54 ms
18.83 times faster
19.53 times faster on average
I recursively dealt with this:
private static HashMap<String,Object> parse(HashMap<String,Object> map, JsonParser parser, JsonToken token) throws IOException { String field = ""; token = parser.nextToken(); while(!token.equals(JsonToken.END_OBJECT)) { if (token != null) { switch (token) { case FIELD_NAME: field = parser.getCurrentName(); break; case VALUE_STRING: map.put(field, parser.getValueAsString()); break; case VALUE_NUMBER_INT: map.put(field, parser.getValueAsInt()); break; case VALUE_NUMBER_FLOAT: map.put(field, parser.getValueAsDouble()); break; case VALUE_TRUE: map.put(field, parser.getValueAsBoolean()); break; case VALUE_FALSE: map.put(field, parser.getValueAsBoolean()); break; case VALUE_NULL: map.put(field, null); break; case START_OBJECT: HashMap<String,Object> objMap = new HashMap<String,Object>(); map.put(field, parse(objMap, parser, token)); break; case START_ARRAY: ArrayList<Object> arrayList = new ArrayList<Object>(); token = parser.nextToken(); while (!token.equals(JsonToken.END_ARRAY)) { if (token.equals(JsonToken.START_OBJECT)) { HashMap<String,Object> arrayMap = new HashMap<String,Object>(); arrayList.add(parse(arrayMap, parser, token)); } else { arrayList.add(parser.getValueAsString()); } token = parser.nextToken(); } map.put(field, arrayList); break; default: break; } } token = parser.nextToken(); } return map; }
source share