diff --git a/jsonb-generator/pom.xml b/jsonb-generator/pom.xml
index 63a8a79f..1c55c0e9 100644
--- a/jsonb-generator/pom.xml
+++ b/jsonb-generator/pom.xml
@@ -32,6 +32,14 @@
provided
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.20
+ true
+ provided
+
+
io.avaje
avaje-prisms
diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java
new file mode 100644
index 00000000..4efaa125
--- /dev/null
+++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java
@@ -0,0 +1,28 @@
+package io.avaje.jsonb.generator;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.lang.model.element.Element;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+
+import io.avaje.jsonb.Json.Alias;
+import io.avaje.prism.GeneratePrism;
+
+@GeneratePrism(value = Alias.class, name = "AvajeAliasPrism", superInterfaces = AliasPrism.class)
+@GeneratePrism(
+ value = JsonAlias.class,
+ name = "JacksonAliasPrism",
+ superInterfaces = AliasPrism.class)
+public interface AliasPrism {
+
+
+ static Optional getOptionalOn(Element element) {
+ return Optional.empty()
+ .or(() -> AvajeAliasPrism.getOptionalOn(element))
+ .or(() -> JacksonAliasPrism.getOptionalOn(element));
+ }
+
+ List value();
+}
diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java
new file mode 100644
index 00000000..6e1daeef
--- /dev/null
+++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java
@@ -0,0 +1,23 @@
+package io.avaje.jsonb.generator;
+
+import javax.lang.model.element.Element;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+import io.avaje.jsonb.Json.Creator;
+import io.avaje.prism.GeneratePrism;
+
+@GeneratePrism(
+ value = Creator.class,
+ name = "AvajeCreatorPrism",
+ superInterfaces = CreatorPrism.class)
+@GeneratePrism(
+ value = JsonCreator.class,
+ name = "JacksonCreatorPrism",
+ superInterfaces = CreatorPrism.class)
+public interface CreatorPrism {
+
+ static boolean isPresent(Element element) {
+ return AvajeCreatorPrism.isPresent(element) || JacksonCreatorPrism.isPresent(element);
+ }
+}
diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java
new file mode 100644
index 00000000..9a3f9719
--- /dev/null
+++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java
@@ -0,0 +1,36 @@
+package io.avaje.jsonb.generator;
+
+import java.util.Optional;
+
+import javax.lang.model.element.Element;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import io.avaje.jsonb.Json.Ignore;
+import io.avaje.prism.GeneratePrism;
+
+@GeneratePrism(value = Ignore.class, name = "AvajeIgnorePrism", superInterfaces = IgnorePrism.class)
+@GeneratePrism(
+ value = JsonIgnore.class,
+ name = "JacksonIgnorePrism",
+ superInterfaces = IgnorePrism.class)
+public interface IgnorePrism {
+
+ static IgnorePrism getInstanceOn(Element element) {
+ return getOptionalOn(element).orElse(null);
+ }
+
+ static Optional getOptionalOn(Element element) {
+ return Optional.empty()
+ .or(() -> AvajeIgnorePrism.getOptionalOn(element))
+ .or(() -> JacksonIgnorePrism.getOptionalOn(element));
+ }
+
+ default Boolean serialize() {
+ return false;
+ }
+
+ default Boolean deserialize() {
+ return false;
+ }
+}
diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java
new file mode 100644
index 00000000..1fadc492
--- /dev/null
+++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java
@@ -0,0 +1,38 @@
+package io.avaje.jsonb.generator;
+
+import java.util.Optional;
+
+import javax.lang.model.element.Element;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.avaje.jsonb.Json.Property;
+import io.avaje.prism.GeneratePrism;
+
+@GeneratePrism(
+ value = Property.class,
+ name = "AvajePropertyPrism",
+ superInterfaces = PropertyPrism.class)
+@GeneratePrism(
+ value = JsonProperty.class,
+ name = "JacksonPropertyPrism",
+ superInterfaces = PropertyPrism.class)
+public interface PropertyPrism {
+
+ static boolean isPresent(Element element) {
+
+ return AvajePropertyPrism.isPresent(element) || JacksonPropertyPrism.isPresent(element);
+ }
+
+ static PropertyPrism getInstanceOn(Element element) {
+ return getOptionalOn(element).orElse(null);
+ }
+
+ static Optional getOptionalOn(Element element) {
+ return Optional.empty()
+ .or(() -> AvajePropertyPrism.getOptionalOn(element))
+ .or(() -> JacksonPropertyPrism.getOptionalOn(element));
+ }
+
+ String value();
+}
diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java
index ae70f8de..52c712cb 100644
--- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java
+++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java
@@ -2,17 +2,13 @@
@GeneratePrism(io.avaje.jsonb.Json.class)
@GeneratePrism(io.avaje.jsonb.Json.Import.class)
@GeneratePrism(io.avaje.jsonb.Json.Import.Imports.class)
-@GeneratePrism(io.avaje.jsonb.Json.Alias.class)
-@GeneratePrism(io.avaje.jsonb.Json.Creator.class)
-@GeneratePrism(io.avaje.jsonb.Json.Ignore.class)
-@GeneratePrism(io.avaje.jsonb.Json.Property.class)
@GeneratePrism(io.avaje.jsonb.Json.MixIn.class)
@GeneratePrism(io.avaje.jsonb.Json.Raw.class)
@GeneratePrism(io.avaje.jsonb.Json.SubTypes.class)
@GeneratePrism(io.avaje.jsonb.Json.SubType.class)
@GeneratePrism(io.avaje.jsonb.Json.Unmapped.class)
-@GeneratePrism(io.avaje.jsonb.Json.Value.class)
@GeneratePrism(io.avaje.jsonb.Json.Serializer.class)
+@GeneratePrism(io.avaje.jsonb.Json.Value.class)
@GeneratePrism(io.avaje.jsonb.spi.MetaData.class)
@GeneratePrism(io.avaje.jsonb.spi.MetaData.JsonFactory.class)
package io.avaje.jsonb.generator;
diff --git a/jsonb-generator/src/main/java/module-info.java b/jsonb-generator/src/main/java/module-info.java
index 43545422..9f04cca6 100644
--- a/jsonb-generator/src/main/java/module-info.java
+++ b/jsonb-generator/src/main/java/module-info.java
@@ -1,6 +1,7 @@
module io.avaje.jsonb.generator {
requires java.compiler;
+ requires static com.fasterxml.jackson.annotation;
requires static io.avaje.json;
requires static io.avaje.jsonb;
requires static io.avaje.prism;
diff --git a/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java b/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java
new file mode 100644
index 00000000..e3eecdde
--- /dev/null
+++ b/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java
@@ -0,0 +1,49 @@
+package io.avaje.jsonb.generator.models.valid.jackson;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.avaje.jsonb.Json;
+
+@Json.Import(JacksonExample.class)
+public class JacksonExample {
+
+ @JsonProperty("id")
+ private final int id;
+
+ @JsonProperty("name")
+ private String name;
+
+ @JsonIgnore private String internalCode;
+
+ @JsonCreator
+ public JacksonExample(
+ @JsonAlias({"identifier", "userId"}) @JsonProperty("id") int id,
+ @JsonProperty("name") String name) {
+ this.id = id;
+ this.name = name;
+ this.internalCode = "";
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getInternalCode() {
+ return internalCode;
+ }
+
+ public void setInternalCode(String internalCode) {
+ this.internalCode = internalCode;
+ }
+}