diff options
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/abi-spec.json | 14 | ||||
-rw-r--r-- | vespajlib/pom.xml | 10 | ||||
-rw-r--r-- | vespajlib/src/main/java/ai/vespa/json/Jackson.java | 27 | ||||
-rw-r--r-- | vespajlib/src/main/java/ai/vespa/json/package-info.java | 7 | ||||
-rw-r--r-- | vespajlib/src/test/java/com/yahoo/slime/JsonBenchmark.java | 18 | ||||
-rw-r--r-- | vespajlib/src/test/java/com/yahoo/tensor/serialization/SerializationTestCase.java | 9 |
6 files changed, 66 insertions, 19 deletions
diff --git a/vespajlib/abi-spec.json b/vespajlib/abi-spec.json index a97950415e4..f496ac62a72 100644 --- a/vespajlib/abi-spec.json +++ b/vespajlib/abi-spec.json @@ -4041,6 +4041,20 @@ ], "fields" : [ ] }, + "ai.vespa.json.Jackson" : { + "superClass" : "java.lang.Object", + "interfaces" : [ ], + "attributes" : [ + "public" + ], + "methods" : [ + "public void <init>()", + "public static com.fasterxml.jackson.databind.ObjectMapper createMapper()", + "public static com.fasterxml.jackson.databind.ObjectMapper createMapper(com.fasterxml.jackson.core.JsonFactoryBuilder)", + "public static com.fasterxml.jackson.databind.ObjectMapper mapper()" + ], + "fields" : [ ] + }, "ai.vespa.llm.LanguageModel" : { "superClass" : "java.lang.Object", "interfaces" : [ ], diff --git a/vespajlib/pom.xml b/vespajlib/pom.xml index 16ae251aa8b..2313a55a857 100644 --- a/vespajlib/pom.xml +++ b/vespajlib/pom.xml @@ -58,6 +58,11 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <scope>provided</scope> + </dependency> + <dependency> <groupId>com.yahoo.vespa</groupId> <artifactId>annotations</artifactId> <version>${project.version}</version> @@ -82,11 +87,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> 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); |