diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
index c4e36de..72b0b50 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
@@ -4,6 +4,7 @@
 
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
+import jakarta.json.spi.JsonProvider;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
@@ -38,6 +39,7 @@
 
   private final List<StructuredParameterProvider> parameterProviders;
   private final List<LabelProvider> labelProviders;
+  private final JsonProvider json;
 
   /**
    * Constructs a {@link Formatter} with custom configuration.
@@ -53,6 +55,7 @@
       Collection<LabelProvider> labelProviders) {
     this.parameterProviders = List.copyOf(parameterProviders);
     this.labelProviders = List.copyOf(labelProviders);
+    this.json = JsonProvider.provider();
   }
 
   /**
@@ -152,7 +155,7 @@
             ndc,
             logRecord.getLevel().intValue() >= 1000 ? ERROR_EVENT_TYPE : null);
 
-    return entry.json().build().toString() + "\n";
+    return entry.json(json).build().toString() + "\n";
   }
 
   /**
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
index 5655373..8517bde 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
@@ -5,9 +5,9 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
 import io.smallrye.common.constraint.Nullable;
-import jakarta.json.Json;
 import jakarta.json.JsonObject;
 import jakarta.json.JsonObjectBuilder;
+import jakarta.json.spi.JsonProvider;
 import java.time.Instant;
 import java.util.List;
 import java.util.Map;
@@ -74,8 +74,8 @@
       this.function = function;
     }
 
-    JsonObject json() {
-      var b = Json.createObjectBuilder();
+    JsonObject json(JsonProvider json) {
+      var b = json.createObjectBuilder();
 
       if (file != null) {
         b.add("file", file);
@@ -107,13 +107,13 @@
       this(t.getEpochSecond(), t.getNano());
     }
 
-    JsonObject json() {
-      return Json.createObjectBuilder().add("seconds", seconds).add("nanos", nanos).build();
+    JsonObject json(JsonProvider json) {
+      return json.createObjectBuilder().add("seconds", seconds).add("nanos", nanos).build();
     }
   }
 
-  JsonObjectBuilder json() {
-    var b = Json.createObjectBuilder();
+  JsonObjectBuilder json(JsonProvider json) {
+    var b = json.createObjectBuilder();
 
     if (trace != null) {
       b.add("logging.googleapis.com/trace", trace);
@@ -128,7 +128,7 @@
     }
 
     if (!labels.isEmpty()) {
-      b.add("logging.googleapis.com/labels", jsonOfStringMap(labels));
+      b.add("logging.googleapis.com/labels", jsonOfStringMap(json, labels));
     }
 
     if (type != null) {
@@ -137,24 +137,25 @@
 
     return b.add("message", message)
         .add("severity", severity)
-        .add("timestamp", timestamp.json())
-        .add("logging.googleapis.com/sourceLocation", sourceLocation.json())
-        .addAll(jsonOfStringMap(mappedDiagnosticContext))
-        .addAll(jsonOfParameterMap(parameters));
+        .add("timestamp", timestamp.json(json))
+        .add("logging.googleapis.com/sourceLocation", sourceLocation.json(json))
+        .addAll(jsonOfStringMap(json, mappedDiagnosticContext))
+        .addAll(jsonOfParameterMap(json, parameters));
   }
 
-  private static JsonObjectBuilder jsonOfStringMap(Map<String, String> stringMap) {
+  private JsonObjectBuilder jsonOfStringMap(JsonProvider json, Map<String, String> stringMap) {
     return stringMap.entrySet().stream()
         .reduce(
-            Json.createObjectBuilder(),
+            json.createObjectBuilder(),
             (acc, x) -> acc.add(x.getKey(), x.getValue()),
             JsonObjectBuilder::addAll);
   }
 
-  private static JsonObjectBuilder jsonOfParameterMap(List<StructuredParameter> parameters) {
+  private JsonObjectBuilder jsonOfParameterMap(
+      JsonProvider json, List<StructuredParameter> parameters) {
     return parameters.stream()
         .reduce(
-            Json.createObjectBuilder(),
+            json.createObjectBuilder(),
             (acc, p) -> acc.addAll(p.json()),
             JsonObjectBuilder::addAll);
   }
diff --git a/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
index b755230..6d40b15 100644
--- a/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
+++ b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
@@ -2,7 +2,7 @@
 
 import static org.junit.jupiter.api.Assertions.assertLinesMatch;
 
-import jakarta.json.Json;
+import jakarta.json.spi.JsonProvider;
 import java.util.Collection;
 import java.util.List;
 import org.jboss.logmanager.ExtLogRecord;
@@ -11,6 +11,8 @@
 
 class FormatterTest {
 
+  private static final JsonProvider JSON = JsonProvider.provider();
+
   @Test
   void simpleRecord() {
     var logRecord = makeSimpleRecord();
@@ -43,7 +45,7 @@
         new StructuredParameterProvider() {
           @Override
           public StructuredParameter getParameter() {
-            var b = Json.createObjectBuilder();
+            var b = JSON.createObjectBuilder();
             b.add("traceId", "39f9a49a9567a8bd7087b708f8932550");
             b.add("spanId", "c7431b14630b633d");
             return () -> b;
@@ -88,7 +90,7 @@
     logRecord.setParameters(
         new Object[] {
           (StructuredParameter)
-              () -> Json.createObjectBuilder().add("one", 1).add("two", 2.0).add("yes", true),
+              () -> JSON.createObjectBuilder().add("one", 1).add("two", 2.0).add("yes", true),
           Label.of("a", "b")
         });
     return logRecord;
@@ -128,7 +130,7 @@
         new Object[] {
           (StructuredParameter)
               () -> {
-                var b = Json.createObjectBuilder();
+                var b = JSON.createObjectBuilder();
                 for (int i = 0; i < 10; i++) {
                   b.add("int-" + i, i);
                 }
