Skip to content

Commit fe0ac39

Browse files
committed
pre-size objectnode map in jackson toJsonNode
fixes #3
1 parent ff6ba69 commit fe0ac39

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

jjq-jackson/src/main/java/io/hyperfoil/tools/jjq/jackson/JacksonConverter.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,25 @@ public static JsonNode toJsonNode(JqValue value, ObjectMapper mapper) {
118118
yield arr;
119119
}
120120
case JqObject o -> {
121-
ObjectNode obj = mapper.createObjectNode();
122-
for (var entry : o.objectValue().entrySet()) {
121+
var fields = o.objectValue();
122+
ObjectNode obj = new ObjectNode(
123+
mapper.getNodeFactory(),
124+
new LinkedHashMap<>(mapCapacityForSize(fields.size())));
125+
for (var entry : fields.entrySet()) {
123126
obj.set(entry.getKey(), toJsonNode(entry.getValue(), mapper));
124127
}
125128
yield obj;
126129
}
127130
};
128131
}
129132

133+
private static int mapCapacityForSize(int size) {
134+
if (size <= 0) return 1;
135+
long capacity = (size * 4L) / 3L + 1L;
136+
if (capacity > Integer.MAX_VALUE) return Integer.MAX_VALUE;
137+
return (int) capacity;
138+
}
139+
130140
private static JsonNode numberToNode(JqNumber n) {
131141
if (n.isIntegral()) {
132142
long l = n.longValue();

0 commit comments

Comments
 (0)