From 857d3842df8212bbc2f395eb6d682c3ab352c950 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?=
Date: Sat, 22 Nov 2025 23:22:02 +0100
Subject: [PATCH 1/5] Jackson 3 upgrade
---
build.gradle | 272 +++++-------------
.../fge/jackson/JsonNumEquivalence.java | 2 +-
.../fge/jackson/JsonNumEquivalenceTest.java | 8 +-
gradle/wrapper/gradle-wrapper.properties | 2 +-
project.gradle | 3 +-
.../com/github/fge/jackson/JacksonUtils.java | 51 ++--
.../com/github/fge/jackson/JsonLoader.java | 2 +-
.../github/fge/jackson/JsonNodeReader.java | 43 +--
.../com/github/fge/jackson/JsonNumEquals.java | 38 ++-
.../java/com/github/fge/jackson/NodeType.java | 6 +-
.../jackson/jsonpointer/JsonNodeResolver.java | 4 +-
.../fge/jackson/jsonpointer/JsonPointer.java | 6 +-
.../jackson/jsonpointer/TokenResolver.java | 4 +-
.../fge/jackson/jsonpointer/TreePointer.java | 10 +-
.../fge/jackson/jsonpointer/package-info.java | 2 +-
.../com/github/fge/jackson/package-info.java | 10 +-
.../github/fge/jackson/JacksonUtilsTest.java | 4 +-
.../fge/jackson/JsonNodeReaderTest.java | 8 +-
.../github/fge/jackson/JsonNumEqualsTest.java | 8 +-
.../fge/jackson/SampleNodeProvider.java | 4 +-
.../jsonpointer/JsonNodeResolverTest.java | 8 +-
.../jackson/jsonpointer/JsonPointerTest.java | 2 +-
.../jackson/jsonpointer/TreePointerTest.java | 2 +-
23 files changed, 179 insertions(+), 320 deletions(-)
diff --git a/build.gradle b/build.gradle
index a679f48..ca44b53 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,226 +17,92 @@
* - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
*/
-buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'biz.aQute.bnd:biz.aQute.bnd.gradle:4.2.0'
- }
-}
-
plugins {
- id("net.ltgt.errorprone") version "0.8.1" apply false
+ id "java-library"
+ id "maven-publish"
+ id "signing"
+ id "idea"
+ id "eclipse"
+ id "com.github.ben-manes.versions" version "0.51.0"
}
-allprojects {
- apply(plugin: "java");
- apply(plugin: "maven");
- apply(plugin: "signing");
- apply(plugin: "biz.aQute.bnd.builder");
- apply(plugin: "idea");
- apply(plugin: "eclipse");
- apply(plugin: "net.ltgt.errorprone");
-
- apply(from: "project.gradle");
-
- group = "com.github.java-json-tools";
-
- ext.forRelease = !version.endsWith("-SNAPSHOT");
-
- /*
- * Repositories to use
- */
- repositories {
- mavenCentral();
- if (!forRelease) {
- maven {
- url "https://oss.sonatype.org/content/repositories/snapshots"
- }
- }
- /* Allow staging references for last pre-release testing. */
- if (project.properties.containsKey("sonatypeUsername")) {
- maven {
- url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
- credentials {
- username = project.properties["sonatypeUsername"]
- password = project.properties["sonatypePassword"]
- }
- }
- }
- }
-
- /*
- * Add errorprone checking.
- */
- dependencies {
- errorprone("com.google.errorprone:error_prone_core:2.3.3")
- errorproneJavac("com.google.errorprone:javac:9+181-r4173-1")
- }
-
- /*
- * Necessary! Otherwise TestNG will not be used...
- *
- * Also, we don't want gradle's default HTML report: it does not support
- * parameterized tests which I use a _lot_.
- */
- test {
- useTestNG() {
- useDefaultListeners = true;
- };
- }
-
- /*
- * Necessary to generate the source and javadoc jars
- */
- task sourcesJar(type: Jar, dependsOn: classes) {
- classifier = "sources";
- from sourceSets.main.allSource;
- }
-
- /*
- * Lint all the things!
- */
- gradle.projectsEvaluated {
- tasks.withType(JavaCompile) {
- options.compilerArgs << "-Xlint:all" << "-Werror"
- }
- tasks.withType(Javadoc) {
- options.addStringOption('Xwerror', '-quiet')
- }
- }
-
- task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = "javadoc";
- from javadoc.destinationDir;
- }
-
- artifacts {
- archives jar;
- archives sourcesJar;
- archives javadocJar;
- }
-
- wrapper {
- gradleVersion = "5.6.3";
- distributionUrl = "https://services.gradle.org/distributions/gradle-${gradleVersion}-all.zip";
- }
+group = "com.github.java-json-tools"
+version = "1.9-SNAPSHOT"
+description = "Core utility classes for Jackson"
- task pom {
- doLast {
- pom {}.writeTo("${projectDir}/pom.xml");
- }
- }
+java {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ withSourcesJar()
+ withJavadocJar()
+}
- /*
- * SIGNING
- */
+repositories {
+ mavenCentral()
+}
- project.ext {
- description = "JSON Pointer (RFC 6901) and numeric equality for Jackson (2.2.x)";
- scmUrl = sprintf("git@github.com:java-json-tools/%s.git", rootProject.name)
- projectURL = sprintf("https://github.com/java-json-tools/%s", rootProject.name);
- sonatypeStaging = "https://oss.sonatype.org/service/local/staging/deploy/maven2/";
- sonatypeSnapshots = "https://oss.sonatype.org/content/repositories/snapshots/";
- };
+dependencies {
+ api "com.google.code.findbugs:jsr305:3.0.2"
+ api "tools.jackson.core:jackson-databind:3.0.0"
+ api "com.github.java-json-tools:msg-simple:1.2"
+
+ testImplementation "org.testng:testng:7.9.0"
+ testImplementation "org.assertj:assertj-core:3.25.3"
+ testImplementation "org.mockito:mockito-core:5.11.0"
+}
- task checkSigningRequirements {
- doLast {
- def requiredProperties = [ "sonatypeUsername", "sonatypePassword" ];
- def noDice = false;
- requiredProperties.each {
- if (project.properties[it] == null) {
- noDice = true;
- System.err.printf("property \"%s\" is not defined!")
- }
- }
- if (noDice)
- throw new IllegalStateException("missing required properties for " +
- "upload");
- }
+test {
+ useTestNG()
+ testLogging {
+ events "passed", "skipped", "failed"
+ exceptionFormat = "full"
}
+}
- uploadArchives {
- dependsOn(checkSigningRequirements);
- repositories {
- mavenDeployer {
- beforeDeployment {
- MavenDeployment deployment -> signing.signPom(deployment);
- }
-
- repository(url: "${sonatypeStaging}") {
- authentication(
- userName: project.properties["sonatypeUsername"],
- password: project.properties["sonatypePassword"]
- );
- }
+javadoc {
+ options.links("https://docs.oracle.com/en/java/javase/17/docs/api/")
+}
- snapshotRepository(url: "${sonatypeSnapshots}") {
- authentication(
- userName: project.properties["sonatypeUsername"],
- password: project.properties["sonatypePassword"]
- );
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ from components.java
+
+ pom {
+ name = "Jackson coreutils"
+ description = "A set of utility classes for use with Jackson"
+ url = "https://github.com/java-json-tools/jackson-coreutils"
+
+ licenses {
+ license {
+ name = "Lesser General Public License, version 3 or greater"
+ url = "http://www.gnu.org/licenses/lgpl.html"
+ }
+ license {
+ name = "Apache Software License, version 2.0"
+ url = "http://www.apache.org/licenses/LICENSE-2.0"
+ }
}
- }
- }
- }
-
- /*
- * Configure pom.xml on install, uploadArchives
- */
- [
- install.repositories.mavenInstaller,
- uploadArchives.repositories.mavenDeployer
- ]*.pom*.whenConfigured { pom ->
- pom.project {
- name "${project.name}";
- packaging "jar";
- description "${project.ext.description}";
- url "${projectURL}";
-
- scm {
- url "${scmUrl}";
- connection "${scmUrl}";
- developerConnection "scm:git:${scmUrl}";
- }
-
- licenses {
- license {
- name "Lesser General Public License, version 3 or greater";
- url "http://www.gnu.org/licenses/lgpl.html";
- distribution "repo";
- };
- license {
- name "Apache Software License, version 2.0";
- url "http://www.apache.org/licenses/LICENSE-2.0";
- distribution "repo";
+
+ scm {
+ url = "https://github.com/java-json-tools/jackson-coreutils"
+ connection = "scm:git:git://github.com/java-json-tools/jackson-coreutils"
}
- }
-
- developers {
- developer {
- id "huggsboson";
- name "John Huffaker";
- email "jhuffaker+java-json-tools@gmail.com";
+
+ developers {
+ developer {
+ id = "fge"
+ name = "Francis Galiegue"
+ email = "fgaliegue@gmail.com"
+ }
}
}
}
}
-
- signing {
- required { forRelease && gradle.taskGraph.hasTask("uploadArchives") };
- sign configurations.archives;
- }
}
-/*
- * Javadoc: we need to tell where the overview.html is, it will not pick it up
- * automatically...
- */
-
-javadoc {
- options.overview = "src/main/java/overview.html";
+signing {
+ required { gradle.taskGraph.hasTask("publish") }
+ sign publishing.publications.mavenJava
}
-
diff --git a/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java b/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java
index 29c2618..160c67d 100644
--- a/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java
+++ b/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java
@@ -18,7 +18,7 @@
*/
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
import com.google.common.base.Equivalence;
/**
diff --git a/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java b/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java
index 939778b..7a613b5 100644
--- a/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java
+++ b/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java
@@ -19,10 +19,10 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.node.ObjectNode;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 3a54a33..e69d040 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/project.gradle b/project.gradle
index bd7379a..a2b9ddd 100644
--- a/project.gradle
+++ b/project.gradle
@@ -29,7 +29,8 @@ targetCompatibility = JavaVersion.VERSION_1_7; // defaults to sourceCompatibilit
* List of dependencies
*/
dependencies {
- implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0");
+ implementation(group: "tools.jackson.core", name: "jackson-databind", version: "3.0.0");
+// implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0");
implementation(group: "com.github.java-json-tools", name: "msg-simple", version: "1.2");
implementation(group: "com.google.code.findbugs", name: "jsr305", version: "3.0.2");
testImplementation(group: "org.testng", name: "testng", version: "7.1.0") {
diff --git a/src/main/java/com/github/fge/jackson/JacksonUtils.java b/src/main/java/com/github/fge/jackson/JacksonUtils.java
index 01750a6..aa2dde8 100644
--- a/src/main/java/com/github/fge/jackson/JacksonUtils.java
+++ b/src/main/java/com/github/fge/jackson/JacksonUtils.java
@@ -19,21 +19,20 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.core.JsonGenerationException;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.core.exc.StreamWriteException;
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.databind.DatabindException;
+import tools.jackson.databind.DeserializationFeature;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectReader;
+import tools.jackson.databind.ObjectWriter;
+import tools.jackson.databind.SerializationFeature;
+import tools.jackson.databind.json.JsonMapper;
+import tools.jackson.databind.node.JsonNodeFactory;
-import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
/**
@@ -98,15 +97,10 @@ public static Map asMap(final JsonNode node)
if (!node.isObject())
return ret;
- final Iterator> iterator = node.fields();
-
- Map.Entry entry;
-
- while (iterator.hasNext()) {
- entry = iterator.next();
- ret.put(entry.getKey(), entry.getValue());
+ for (Map.Entry property : node.properties()) {
+ ret.put(property.getKey(), property.getValue());
}
-
+
return ret;
}
@@ -124,11 +118,11 @@ public static String prettyPrint(final JsonNode node)
try {
WRITER.writeValue(writer, node);
writer.flush();
- } catch (JsonGenerationException e) {
+ } catch (StreamWriteException e) {
throw new RuntimeException("How did I get there??", e);
- } catch (JsonMappingException e) {
+ } catch (DatabindException e) {
throw new RuntimeException("How did I get there??", e);
- } catch (IOException ignored) {
+ //} catch (IOException ignored) {
// cannot happen
}
@@ -142,7 +136,7 @@ public static String prettyPrint(final JsonNode node)
*
*
* - {@link DeserializationFeature#USE_BIG_DECIMAL_FOR_FLOATS};
- * - {@link com.fasterxml.jackson.core.JsonGenerator.Feature#WRITE_BIGDECIMAL_AS_PLAIN};
+ * - {@link StreamWriteFeature#WRITE_BIGDECIMAL_AS_PLAIN};
* - {@link SerializationFeature#INDENT_OUTPUT}.
*
*
@@ -152,9 +146,10 @@ public static String prettyPrint(final JsonNode node)
*/
public static ObjectMapper newMapper()
{
- return new ObjectMapper().setNodeFactory(FACTORY)
- .enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)
- .enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN)
- .enable(SerializationFeature.INDENT_OUTPUT);
+ return JsonMapper.builder().nodeFactory(FACTORY)
+ .enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)
+ .enable(StreamWriteFeature.WRITE_BIGDECIMAL_AS_PLAIN)
+ .enable(SerializationFeature.INDENT_OUTPUT)
+ .build();
}
}
diff --git a/src/main/java/com/github/fge/jackson/JsonLoader.java b/src/main/java/com/github/fge/jackson/JsonLoader.java
index 5a3467b..3101daf 100644
--- a/src/main/java/com/github/fge/jackson/JsonLoader.java
+++ b/src/main/java/com/github/fge/jackson/JsonLoader.java
@@ -19,7 +19,7 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
import javax.annotation.Nonnull;
import java.io.File;
diff --git a/src/main/java/com/github/fge/jackson/JsonNodeReader.java b/src/main/java/com/github/fge/jackson/JsonNodeReader.java
index 2e6c622..1590521 100644
--- a/src/main/java/com/github/fge/jackson/JsonNodeReader.java
+++ b/src/main/java/com/github/fge/jackson/JsonNodeReader.java
@@ -20,13 +20,13 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.core.JsonLocation;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.MappingIterator;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
+import tools.jackson.core.TokenStreamLocation;
+import tools.jackson.core.exc.StreamReadException;
+import tools.jackson.core.JsonParser;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.MappingIterator;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectReader;
import com.github.fge.Builder;
import com.github.fge.msgsimple.bundle.MessageBundle;
import com.github.fge.msgsimple.bundle.PropertiesBundle;
@@ -36,6 +36,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
+import tools.jackson.core.StreamReadFeature;
/**
* Class dedicated to reading JSON values from {@link InputStream}s and {@link
@@ -69,8 +70,10 @@ public final class JsonNodeReader
public JsonNodeReader(final ObjectMapper mapper)
{
- reader = mapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
- .readerFor(JsonNode.class);
+ reader = mapper.rebuild()
+ .enable(StreamReadFeature.AUTO_CLOSE_SOURCE)
+ .build()
+ .readerFor(JsonNode.class);
}
/**
@@ -96,7 +99,7 @@ public JsonNode fromInputStream(final InputStream in)
MappingIterator iterator = null;
try {
- parser = reader.getFactory().createParser(in);
+ parser = reader.createParser(in);
iterator = reader.readValues(parser);
return readNode(iterator);
} finally {
@@ -124,7 +127,7 @@ public JsonNode fromReader(final Reader r)
MappingIterator iterator = null;
try {
- parser = reader.getFactory().createParser(r);
+ parser = reader.createParser(r);
iterator = reader.readValues(parser);
return readNode(iterator);
} finally {
@@ -140,7 +143,7 @@ public JsonNode fromReader(final Reader r)
private static JsonNode readNode(final MappingIterator iterator)
throws IOException
{
- final JsonParser parser = iterator.getParser();
+ final JsonParser parser = iterator.parser();
final JsonParseExceptionBuilder builder
= new JsonParseExceptionBuilder(parser);
@@ -152,12 +155,12 @@ private static JsonNode readNode(final MappingIterator iterator)
final JsonNode ret = iterator.nextValue();
builder.setMessage(BUNDLE.getMessage("read.trailingData"))
- .setLocation(iterator.getCurrentLocation());
+ .setLocation(iterator.currentLocation());
try {
if (iterator.hasNextValue())
throw builder.build();
- } catch (JsonParseException e) {
+ } catch (StreamReadException e) {
throw builder.setLocation(e.getLocation()).build();
}
@@ -165,17 +168,17 @@ private static JsonNode readNode(final MappingIterator iterator)
}
private static final class JsonParseExceptionBuilder
- implements Builder
+ implements Builder
{
private JsonParser parser;
private String message = "";
- private JsonLocation location;
+ private TokenStreamLocation location;
private JsonParseExceptionBuilder(@Nonnull final JsonParser parser)
{
BUNDLE.checkNotNull(parser, "read.nullArgument");
this.parser = parser;
- location = parser.getCurrentLocation();
+ location = parser.currentLocation();
}
private JsonParseExceptionBuilder setMessage(
@@ -186,16 +189,16 @@ private JsonParseExceptionBuilder setMessage(
}
private JsonParseExceptionBuilder setLocation(
- @Nonnull final JsonLocation location)
+ @Nonnull final TokenStreamLocation location)
{
this.location = BUNDLE.checkNotNull(location, "read.nullArgument");
return this;
}
@Override
- public JsonParseException build()
+ public StreamReadException build()
{
- return new JsonParseException(parser, message, location);
+ return new StreamReadException(parser, message, location);
}
}
}
diff --git a/src/main/java/com/github/fge/jackson/JsonNumEquals.java b/src/main/java/com/github/fge/jackson/JsonNumEquals.java
index 2bb4bc7..5d5d8f2 100644
--- a/src/main/java/com/github/fge/jackson/JsonNumEquals.java
+++ b/src/main/java/com/github/fge/jackson/JsonNumEquals.java
@@ -19,7 +19,7 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Iterator;
@@ -84,7 +84,7 @@ protected boolean doEquivalent(final JsonNode a, final JsonNode b)
/*
* For all other primitive types than numbers, trust JsonNode
*/
- if (!a.isContainerNode())
+ if (!a.isContainer())
return a.equals(b);
/*
@@ -122,7 +122,7 @@ protected int doHash(final JsonNode t)
* If this is a primitive type (other than numbers, handled above),
* delegate to JsonNode.
*/
- if (!t.isContainerNode())
+ if (!t.isContainer())
return t.hashCode();
/*
@@ -151,16 +151,12 @@ protected int doHash(final JsonNode t)
/*
* Not an array? An object.
*/
- final Iterator> iterator = t.fields();
-
- Map.Entry entry;
-
- while (iterator.hasNext()) {
- entry = iterator.next();
+ for (Map.Entry property : t.properties()) {
ret = 31 * ret
- + (entry.getKey().hashCode() ^ hash(entry.getValue()));
+ + (property.getKey().hashCode() ^ hash(property.getValue()));
+
}
-
+
return ret;
}
@@ -198,26 +194,24 @@ private boolean objectEquals(final JsonNode a, final JsonNode b)
* Grab the key set from the first node
*/
final Set keys = new HashSet<>();
- Iterator iterator1 = a.fieldNames();
- while (iterator1.hasNext()) {
- final String next = iterator1.next();
- if (next != null) {
- keys.add(next);
+
+ for (String propertyName : a.propertyNames()) {
+ if (propertyName != null) {
+ keys.add(propertyName);
} else {
throw new NullPointerException();
}
}
-
+
/*
* Grab the key set from the second node, and see if both sets are the
* same. If not, objects are not equal, no need to check for children.
*/
final Set set = new HashSet<>();
- Iterator iterator2 = b.fieldNames();
- while (iterator2.hasNext()) {
- final String next = iterator2.next();
- if (next != null) {
- set.add(next);
+
+ for (String propertyName : b.propertyNames()) {
+ if (propertyName != null) {
+ set.add(propertyName);
} else {
throw new NullPointerException();
}
diff --git a/src/main/java/com/github/fge/jackson/NodeType.java b/src/main/java/com/github/fge/jackson/NodeType.java
index 67ddf86..ee79d99 100644
--- a/src/main/java/com/github/fge/jackson/NodeType.java
+++ b/src/main/java/com/github/fge/jackson/NodeType.java
@@ -19,9 +19,9 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.core.JsonToken;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.MissingNode;
+import tools.jackson.core.JsonToken;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.MissingNode;
import java.util.Collections;
import java.util.EnumMap;
diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java b/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java
index c3c351a..574bfd0 100644
--- a/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java
+++ b/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java
@@ -19,7 +19,7 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
import javax.annotation.concurrent.Immutable;
@@ -47,7 +47,7 @@ public JsonNodeResolver(final ReferenceToken token)
@Override
public JsonNode get(final JsonNode node)
{
- if (node == null || !node.isContainerNode())
+ if (node == null || !node.isContainer())
return null;
final String raw = token.getRaw();
return node.isObject() ? node.get(raw) : node.get(arrayIndexFor(raw));
diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java b/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java
index 0aae6a5..3ec2629 100644
--- a/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java
+++ b/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java
@@ -19,9 +19,9 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.core.TreeNode;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.MissingNode;
+import tools.jackson.core.TreeNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.MissingNode;
import javax.annotation.concurrent.Immutable;
import java.util.ArrayList;
diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java b/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java
index cbef821..16657da 100644
--- a/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java
+++ b/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java
@@ -19,8 +19,8 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.core.TreeNode;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.core.TreeNode;
+import tools.jackson.databind.JsonNode;
import javax.annotation.concurrent.ThreadSafe;
diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java b/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java
index 8d6daee..b509fe8 100644
--- a/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java
+++ b/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java
@@ -19,11 +19,11 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.core.TreeNode;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.node.MissingNode;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.core.TreeNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.node.MissingNode;
+import tools.jackson.databind.ser.std.ToStringSerializer;
import com.github.fge.msgsimple.bundle.MessageBundle;
import com.github.fge.msgsimple.load.MessageBundles;
diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java b/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java
index 80e2217..e9c5527 100644
--- a/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java
+++ b/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java
@@ -23,7 +23,7 @@
* This package, while primarily centered on {@link
* com.github.fge.jackson.jsonpointer.JsonPointer}, is a generalization of JSON
* Pointer to all implementations of Jackson's {@link
- * com.fasterxml.jackson.core.TreeNode}.
+ * tools.jackson.core.TreeNode}.
*
* The fundamentals of JSON Pointer remain the same, however: a JSON pointer
* is a set of reference tokens separated by the {@code /} character. One
diff --git a/src/main/java/com/github/fge/jackson/package-info.java b/src/main/java/com/github/fge/jackson/package-info.java
index 44641ad..661dcd6 100644
--- a/src/main/java/com/github/fge/jackson/package-info.java
+++ b/src/main/java/com/github/fge/jackson/package-info.java
@@ -21,28 +21,28 @@
* Jackson utility classes
*
*
{@link com.github.fge.jackson.JsonLoader} contains various methods to load
- * JSON documents as {@link com.fasterxml.jackson.databind.JsonNode}s. It uses
+ * JSON documents as {@link tools.jackson.databind.JsonNode}s. It uses
* a {@link com.github.fge.jackson.JsonNodeReader} (as such, parsing {@code []]}
* will generate an error where Jackson normally does not).
*
* You will also want to use {@link com.github.fge.jackson.JacksonUtils}
* to grab a node factory, reader and pretty printer for anything JSON. Compared
- * to the basic Jackson's {@link com.fasterxml.jackson.databind.ObjectMapper},
+ * to the basic Jackson's {@link tools.jackson.databind.ObjectMapper},
* the one provided by {@link com.github.fge.jackson.JacksonUtils} deserializes
* all floating point numbers as {@link java.math.BigDecimal}s by default. This
* is done using {@link
- * com.fasterxml.jackson.databind.DeserializationFeature#USE_BIG_DECIMAL_FOR_FLOATS}.
+ * tools.jackson.databind.DeserializationFeature#USE_BIG_DECIMAL_FOR_FLOATS}.
*
*
* {@link com.github.fge.jackson.JsonNumEquals} is an {@code
* com.google.common.base.Equivalence} over {@link
- * com.fasterxml.jackson.databind.JsonNode} for recursive equivalence of JSON
+ * tools.jackson.databind.JsonNode} for recursive equivalence of JSON
* number values.
*
* Finally, {@link com.github.fge.jackson.NodeType} is a utility enumeration
* which distinguishes between all JSON node types defined by RFC 7159, plus
* {@code integer} (used by JSON Schema). Note that since Jackson 2.2, there is
- * also {@link com.fasterxml.jackson.databind.JsonNode#getNodeType()}, but it
+ * also {@link tools.jackson.databind.JsonNode#getNodeType()}, but it
* does not make a difference between {@code number} and {@code integer}.
*/
package com.github.fge.jackson;
diff --git a/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java b/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java
index 7ebf6aa..c43b7c9 100644
--- a/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java
+++ b/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java
@@ -19,8 +19,8 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.JsonNodeFactory;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
diff --git a/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java b/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java
index 2965822..79b7315 100644
--- a/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java
+++ b/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java
@@ -19,9 +19,9 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.core.exc.StreamReadException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
import com.github.fge.msgsimple.bundle.MessageBundle;
import com.github.fge.msgsimple.bundle.PropertiesBundle;
import org.testng.annotations.DataProvider;
@@ -93,7 +93,7 @@ public void malformedDataThrowsExpectedException(final String input,
try {
reader.fromInputStream(supplier.get());
fail("No exception thrown!!");
- } catch (JsonParseException e) {
+ } catch (StreamReadException e) {
assertEquals(e.getOriginalMessage(), message);
}
}
diff --git a/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java b/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java
index af4d068..36ca8d4 100644
--- a/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java
+++ b/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java
@@ -19,10 +19,10 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.node.ObjectNode;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
diff --git a/src/test/java/com/github/fge/jackson/SampleNodeProvider.java b/src/test/java/com/github/fge/jackson/SampleNodeProvider.java
index 23817f7..54772de 100644
--- a/src/test/java/com/github/fge/jackson/SampleNodeProvider.java
+++ b/src/test/java/com/github/fge/jackson/SampleNodeProvider.java
@@ -19,8 +19,8 @@
package com.github.fge.jackson;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.JsonNodeFactory;
import java.math.BigDecimal;
import java.util.*;
diff --git a/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java b/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java
index 6f22fda..9c22abb 100644
--- a/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java
+++ b/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java
@@ -19,10 +19,10 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.node.ObjectNode;
import com.github.fge.jackson.JacksonUtils;
import com.github.fge.jackson.NodeType;
import com.github.fge.jackson.SampleNodeProvider;
diff --git a/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java b/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java
index be19a61..dbbc133 100644
--- a/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java
+++ b/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java
@@ -19,7 +19,7 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
import com.github.fge.jackson.JacksonUtils;
import com.github.fge.jackson.JsonLoader;
import com.github.fge.jackson.NodeType;
diff --git a/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java b/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java
index 2edc050..8629875 100644
--- a/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java
+++ b/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java
@@ -19,7 +19,7 @@
package com.github.fge.jackson.jsonpointer;
-import com.fasterxml.jackson.core.TreeNode;
+import tools.jackson.core.TreeNode;
import com.github.fge.msgsimple.bundle.MessageBundle;
import com.github.fge.msgsimple.load.MessageBundles;
import org.testng.annotations.Test;
From 8785c1358d431987fad0af56ed32c02265697543 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?=
Date: Sun, 23 Nov 2025 00:58:11 +0100
Subject: [PATCH 2/5] Jackson 3 upgrade
---
build.gradle | 2 +-
src/main/java/com/github/fge/jackson/JacksonUtils.java | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index ca44b53..4a5e7bb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,7 +27,7 @@ plugins {
}
group = "com.github.java-json-tools"
-version = "1.9-SNAPSHOT"
+version = "2.0-SNAPSHOT"
description = "Core utility classes for Jackson"
java {
diff --git a/src/main/java/com/github/fge/jackson/JacksonUtils.java b/src/main/java/com/github/fge/jackson/JacksonUtils.java
index aa2dde8..3b19aaa 100644
--- a/src/main/java/com/github/fge/jackson/JacksonUtils.java
+++ b/src/main/java/com/github/fge/jackson/JacksonUtils.java
@@ -34,6 +34,8 @@
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
+import tools.jackson.core.ObjectReadContext;
+import tools.jackson.databind.DeserializationConfig;
/**
* Utility class for Jackson
From cefea03870fdfe6cd3544b14459a78e255d948bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?=
Date: Sun, 23 Nov 2025 09:59:04 +0100
Subject: [PATCH 3/5] Jackson 3 upgrade
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index 4a5e7bb..8eca9f4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,7 +27,7 @@ plugins {
}
group = "com.github.java-json-tools"
-version = "2.0-SNAPSHOT"
+version = "2.1-SNAPSHOT"
description = "Core utility classes for Jackson"
java {
From 880c801a9220a08753967120259345ac320fbf85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?=
Date: Sun, 23 Nov 2025 13:46:02 +0100
Subject: [PATCH 4/5] Delete project.gradle
---
project.gradle | 56 --------------------------------------------------
1 file changed, 56 deletions(-)
delete mode 100644 project.gradle
diff --git a/project.gradle b/project.gradle
deleted file mode 100644
index a2b9ddd..0000000
--- a/project.gradle
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2014, Francis Galiegue (fgaliegue@gmail.com)
- *
- * This software is dual-licensed under:
- *
- * - the Lesser General Public License (LGPL) version 3.0 or, at your option, any
- * later version;
- * - the Apache Software License (ASL) version 2.0.
- *
- * The text of this file and of both licenses is available at the root of this
- * project or, if you have the jar distribution, in directory META-INF/, under
- * the names LGPL-3.0.txt and ASL-2.0.txt respectively.
- *
- * Direct link to the sources:
- *
- * - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt
- * - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- */
-
-/*
- * Project-specific settings. Unfortunately we cannot put the name in there!
- */
-group = "com.github.java-json-tools";
-version = "2.0";
-sourceCompatibility = JavaVersion.VERSION_1_7;
-targetCompatibility = JavaVersion.VERSION_1_7; // defaults to sourceCompatibility
-
-/*
- * List of dependencies
- */
-dependencies {
- implementation(group: "tools.jackson.core", name: "jackson-databind", version: "3.0.0");
-// implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0");
- implementation(group: "com.github.java-json-tools", name: "msg-simple", version: "1.2");
- implementation(group: "com.google.code.findbugs", name: "jsr305", version: "3.0.2");
- testImplementation(group: "org.testng", name: "testng", version: "7.1.0") {
- exclude(group: "junit", module: "junit");
- exclude(group: "org.beanshell", module: "bsh");
- exclude(group: "org.yaml", module: "snakeyaml");
- };
- testImplementation(group: "org.mockito", name: "mockito-core", version: "2.28.2");
-}
-
-javadoc {
- options {
- def currentJavaVersion = org.gradle.api.JavaVersion.current()
- // FIXME: https://github.com/gradle/gradle/issues/11182
- if (currentJavaVersion.compareTo(org.gradle.api.JavaVersion.VERSION_1_9) >= 0) {
- addStringOption("-release", "7");
- }
- links("https://docs.oracle.com/javase/7/docs/api/");
- links("https://www.javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/");
- links("https://fasterxml.github.io/jackson-databind/javadoc/2.11/");
- links("https://java-json-tools.github.io/msg-simple/");
- }
-}
From 33fd8eb2e8cbe1a2fa61794ae75b3271d6501c41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?=
Date: Sun, 23 Nov 2025 13:52:54 +0100
Subject: [PATCH 5/5] Update project files
---
.travis.yml | 3 +--
CONTRIBUTORS.md | 4 ++++
README.md | 14 +++++++-------
equivalence/project.gradle | 21 ++++++---------------
4 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 0360f23..eb62683 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,6 @@
language: java
jdk:
- - openjdk8
- - openjdk11
+ - openjdk17
install: {}
script:
- ./gradlew assemble check
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index ab634da..d6b6624 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1,3 +1,7 @@
+## Kovács Zoltán (https://github.com/kz282)
+
+* Upgrade to Jackson 3.0
+
## Randy Watler
* Added `.parent()` to `JsonPointer` (darn useful!).
diff --git a/README.md b/README.md
index 6fa8e99..de4565d 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ project for details.
## What this is
-This package is meant to be used with Jackson 2.2.x. It provides the three following features:
+This package is meant to be used with Jackson 3.0.x. It provides the three following features:
* write/read JSON decimal numbers using `BigDecimal` (instead of `double`) for optimal numeric
precision;
@@ -30,8 +30,8 @@ This package is meant to be used with Jackson 2.2.x. It provides the three follo
## Versions
-* `jackson-coreutils` is **2.0**
-* `jackson-coreutils-equivalence` is **1.0**
+* `jackson-coreutils` is **2.1**
+* `jackson-coreutils-equivalence` is **1.1**
Javadoc is [available
online](https://java-json-tools.github.io/jackson-coreutils/index.html).
@@ -44,8 +44,8 @@ With Gradle:
```groovy
dependencies {
- compile(group: "com.github.java-json-tools", name: "jackson-coreutils", version: "2.0");
- compile(group: "com.github.java-json-tools", name: "jackson-coreutils-equivalence", version: "1.0");
+ compile(group: "com.github.java-json-tools", name: "jackson-coreutils", version: "2.1");
+ compile(group: "com.github.java-json-tools", name: "jackson-coreutils-equivalence", version: "1.1");
}
```
@@ -55,12 +55,12 @@ With Maven:
com.github.java-json-tools
jackson-coreutils
- 2.0
+ 2.1
com.github.java-json-tools
jackson-coreutils-equivalence
- 1.0
+ 1.1
```
diff --git a/equivalence/project.gradle b/equivalence/project.gradle
index e95017b..448832b 100644
--- a/equivalence/project.gradle
+++ b/equivalence/project.gradle
@@ -21,18 +21,16 @@
* Project-specific settings. Unfortunately we cannot put the name in there!
*/
group = "com.github.java-json-tools";
-version = "1.0";
-sourceCompatibility = JavaVersion.VERSION_1_7;
-targetCompatibility = JavaVersion.VERSION_1_7; // defaults to sourceCompatibility
+version = "1.1";
+sourceCompatibility = JavaVersion.VERSION_17;
+targetCompatibility = JavaVersion.VERSION_17; // defaults to sourceCompatibility
/*
* List of dependencies
*/
dependencies {
- implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0");
- implementation(group: "com.google.guava", name: "guava", version: "28.2-android");
- implementation(group: "com.github.java-json-tools", name: "jackson-coreutils", version: "2.0");
- testImplementation(group: "org.testng", name: "testng", version: "7.1.0") {
+ api "com.github.java-json-tools:jackson-coreutils:2.1-SNAPSHOT"
+ testImplementation(group: "org.testng", name: "testng", version: "7.9.0") {
exclude(group: "junit", module: "junit");
exclude(group: "org.beanshell", module: "bsh");
exclude(group: "org.yaml", module: "snakeyaml");
@@ -41,14 +39,7 @@ dependencies {
javadoc {
options {
- def currentJavaVersion = org.gradle.api.JavaVersion.current()
- // FIXME: https://github.com/gradle/gradle/issues/11182
- if (currentJavaVersion.compareTo(org.gradle.api.JavaVersion.VERSION_1_9) >= 0) {
- addStringOption("-release", "7");
- }
- links("https://docs.oracle.com/javase/7/docs/api/");
- links("https://fasterxml.github.io/jackson-databind/javadoc/2.11/");
- links("https://www.javadoc.io/doc/com.google.guava/guava/28.2-android/");
+ links("https://docs.oracle.com/en/java/javase/17/docs/api/");
links("https://java-json-tools.github.io/jackson-coreutils/");
}
}