diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-23 16:07:43 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-23 16:12:51 +0100 |
commit | ef535f6c51393d945d9fe07de38de224d5ae443f (patch) | |
tree | 2f5976537a200aebbf6644b8e1ef93f2c669319d /vespajlib/src | |
parent | f966346429c85fc31c8ea962b518e02a19f77f46 (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')
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); |