aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-11-23 16:07:43 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2023-11-23 16:12:51 +0100
commitef535f6c51393d945d9fe07de38de224d5ae443f (patch)
tree2f5976537a200aebbf6644b8e1ef93f2c669319d /vespajlib/src
parentf966346429c85fc31c8ea962b518e02a19f77f46 (diff)
jackson 2.16 changes some of its default settings so we consolidate our use of the ObjectMapper.
Unless special options are used, use a common instance, or create via factory metod.
Diffstat (limited to 'vespajlib/src')
-rw-r--r--vespajlib/src/main/java/ai/vespa/json/Jackson.java27
-rw-r--r--vespajlib/src/main/java/ai/vespa/json/package-info.java7
-rw-r--r--vespajlib/src/test/java/com/yahoo/slime/JsonBenchmark.java18
-rw-r--r--vespajlib/src/test/java/com/yahoo/tensor/serialization/SerializationTestCase.java9
4 files changed, 47 insertions, 14 deletions
diff --git a/vespajlib/src/main/java/ai/vespa/json/Jackson.java b/vespajlib/src/main/java/ai/vespa/json/Jackson.java
new file mode 100644
index 00000000000..58c775486ad
--- /dev/null
+++ b/vespajlib/src/main/java/ai/vespa/json/Jackson.java
@@ -0,0 +1,27 @@
+// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.json;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonFactoryBuilder;
+import com.fasterxml.jackson.core.StreamReadFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class Jackson {
+ private static final ObjectMapper mapperInstance = createMapper();
+ /// Create an ObjectMapper based on given factory, adds additional recommended settings
+ public static ObjectMapper createMapper() {
+ return createMapper(new JsonFactoryBuilder());
+ }
+
+ /// Create an ObjectMapper based on given factory, adds additional recommended settings
+ public static ObjectMapper createMapper(JsonFactoryBuilder jsonFactoryBuilder) {
+ JsonFactory jsonFactory = jsonFactoryBuilder
+ // This changes in 2.16, needs to consider what to do
+ .configure(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION, true)
+ .build();
+ return new ObjectMapper(jsonFactory);
+ }
+
+ /// Return a default ObjectMapper with recommended settings
+ public static ObjectMapper mapper() { return mapperInstance; }
+}
diff --git a/vespajlib/src/main/java/ai/vespa/json/package-info.java b/vespajlib/src/main/java/ai/vespa/json/package-info.java
new file mode 100644
index 00000000000..95aa7b427c8
--- /dev/null
+++ b/vespajlib/src/main/java/ai/vespa/json/package-info.java
@@ -0,0 +1,7 @@
+// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+@ExportPackage
+@PublicApi
+package ai.vespa.json;
+
+import com.yahoo.api.annotations.PublicApi;
+import com.yahoo.osgi.annotation.ExportPackage; \ No newline at end of file
diff --git a/vespajlib/src/test/java/com/yahoo/slime/JsonBenchmark.java b/vespajlib/src/test/java/com/yahoo/slime/JsonBenchmark.java
index 19862e874d6..e1aafca8d22 100644
--- a/vespajlib/src/test/java/com/yahoo/slime/JsonBenchmark.java
+++ b/vespajlib/src/test/java/com/yahoo/slime/JsonBenchmark.java
@@ -1,11 +1,11 @@
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.slime;
+import ai.vespa.json.Jackson;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -38,12 +38,13 @@ public class JsonBenchmark {
try {
for (int i=0; i < numIterations; i++) {
- JsonParser jsonParser = jsonFactory.createParser(json);
- JsonToken array = jsonParser.nextToken();
- for (JsonToken token = jsonParser.nextToken(); ! JsonToken.END_ARRAY.equals(token); token = jsonParser.nextToken()) {
- if (JsonToken.FIELD_NAME.equals(token) && "weight".equals(jsonParser.getCurrentName())) {
- token = jsonParser.nextToken();
- count += jsonParser.getLongValue();
+ try (JsonParser jsonParser = jsonFactory.createParser(json)) {
+ JsonToken array = jsonParser.nextToken();
+ for (JsonToken token = jsonParser.nextToken(); !JsonToken.END_ARRAY.equals(token); token = jsonParser.nextToken()) {
+ if (JsonToken.FIELD_NAME.equals(token) && "weight".equals(jsonParser.getCurrentName())) {
+ token = jsonParser.nextToken();
+ count += jsonParser.getLongValue();
+ }
}
}
}
@@ -54,11 +55,10 @@ public class JsonBenchmark {
}
private static long benchmarkJacksonTree(byte [] json, int numIterations) {
long count = 0;
- ObjectMapper mapper = new ObjectMapper();
// use the ObjectMapper to read the json string and create a tree
try {
for (int i=0; i < numIterations; i++) {
- JsonNode node = mapper.readTree(json);
+ JsonNode node = Jackson.mapper().readTree(json);
for(JsonNode item : node) {
count += item.get("weight").asLong();
}
diff --git a/vespajlib/src/test/java/com/yahoo/tensor/serialization/SerializationTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/serialization/SerializationTestCase.java
index 2be61de0bfa..147cb402cb3 100644
--- a/vespajlib/src/test/java/com/yahoo/tensor/serialization/SerializationTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/tensor/serialization/SerializationTestCase.java
@@ -2,8 +2,8 @@
package com.yahoo.tensor.serialization;
+import ai.vespa.json.Jackson;
import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.tensor.Tensor;
import com.yahoo.tensor.TensorType;
@@ -25,8 +25,8 @@ import static org.junit.Assert.assertTrue;
public class SerializationTestCase {
- private static String testPath = "eval/src/apps/make_tensor_binary_format_test_spec/test_spec.json";
- private static List<String> tests = new ArrayList<>();
+ private static final String testPath = "eval/src/apps/make_tensor_binary_format_test_spec/test_spec.json";
+ private static final List<String> tests = new ArrayList<>();
@Before
public void loadTests() throws IOException {
@@ -46,8 +46,7 @@ public class SerializationTestCase {
@Test
public void testSerialization() throws IOException {
for (String test : tests) {
- ObjectMapper mapper = new ObjectMapper();
- JsonNode node = mapper.readTree(test);
+ JsonNode node = Jackson.mapper().readTree(test);
if (node.has("tensor") && node.has("binary")) {
System.out.println("Running test: " + test);