diff --git a/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java b/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
index 4cc561a..51fc87f 100644
--- a/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
+++ b/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
@@ -24,7 +24,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.druid.jackson.DefaultObjectMapper;
+import org.apache.druid.guice.annotations.Json;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.math.expr.Expr;
 import org.apache.druid.math.expr.ExprEval;
@@ -38,6 +38,7 @@
 import org.apache.druid.segment.nested.StructuredDataProcessor;
 
 import javax.annotation.Nullable;
+import javax.inject.Inject;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -45,8 +46,6 @@
 
 public class NestedDataExpressions
 {
-  private static final ObjectMapper JSON_MAPPER = new DefaultObjectMapper();
-
   public static final ExpressionType TYPE = Preconditions.checkNotNull(
       ExpressionType.fromColumnType(NestedDataComplexTypeSerde.TYPE)
   );
@@ -108,7 +107,7 @@
   public static class JsonObjectExprMacro extends StructExprMacro
   {
     public static final String NAME = "json_object";
-    
+
     @Override
     public String name()
     {
@@ -168,6 +167,16 @@
   {
     public static final String NAME = "to_json_string";
 
+    private final ObjectMapper jsonMapper;
+
+    @Inject
+    public ToJsonStringExprMacro(
+        @Json ObjectMapper jsonMapper
+    )
+    {
+      this.jsonMapper = jsonMapper;
+    }
+
     @Override
     public String name()
     {
@@ -190,7 +199,7 @@
           ExprEval input = args.get(0).eval(bindings);
           try {
             final Object unwrapped = maybeUnwrapStructuredData(input);
-            final String stringify = unwrapped == null ? null : JSON_MAPPER.writeValueAsString(unwrapped);
+            final String stringify = unwrapped == null ? null : jsonMapper.writeValueAsString(unwrapped);
             return ExprEval.ofType(
                 ExpressionType.STRING,
                 stringify
@@ -223,6 +232,16 @@
   {
     public static final String NAME = "parse_json";
 
+    private final ObjectMapper jsonMapper;
+
+    @Inject
+    public ParseJsonExprMacro(
+        @Json ObjectMapper jsonMapper
+    )
+    {
+      this.jsonMapper = jsonMapper;
+    }
+
     @Override
     public String name()
     {
@@ -246,7 +265,7 @@
           Object parsed = maybeUnwrapStructuredData(arg);
           if (arg.type().is(ExprType.STRING) && arg.value() != null && maybeJson(arg.asString())) {
             try {
-              parsed = JSON_MAPPER.readValue(arg.asString(), Object.class);
+              parsed = jsonMapper.readValue(arg.asString(), Object.class);
             }
             catch (JsonProcessingException e) {
               throw new IAE("Bad string input [%s] to [%s]", arg.asString(), name());
diff --git a/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java b/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java
index a1c9e43..daa4f14 100644
--- a/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java
+++ b/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java
@@ -271,7 +271,11 @@
     return createIncrementalIndex(Granularities.DAY, true, true, 1000);
   }
 
-  public static List<Segment> createDefaultHourlySegments(AggregationTestHelper helper, TemporaryFolder tempFolder, Closer closer)
+  public static List<Segment> createDefaultHourlySegments(
+      AggregationTestHelper helper,
+      TemporaryFolder tempFolder,
+      Closer closer
+  )
       throws Exception
   {
     return createSegments(
@@ -284,7 +288,11 @@
     );
   }
 
-  public static List<Segment> createDefaultHourlySegmentsTsv(AggregationTestHelper helper, TemporaryFolder tempFolder, Closer closer)
+  public static List<Segment> createDefaultHourlySegmentsTsv(
+      AggregationTestHelper helper,
+      TemporaryFolder tempFolder,
+      Closer closer
+  )
       throws Exception
   {
     return createTsvSegments(
@@ -297,7 +305,11 @@
     );
   }
 
-  public static List<Segment> createDefaultDaySegments(AggregationTestHelper helper, TemporaryFolder tempFolder, Closer closer)
+  public static List<Segment> createDefaultDaySegments(
+      AggregationTestHelper helper,
+      TemporaryFolder tempFolder,
+      Closer closer
+  )
       throws Exception
   {
     return createSegments(
diff --git a/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java b/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
index 98f2e9c..ff2daf2 100644
--- a/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
+++ b/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
@@ -19,9 +19,11 @@
 
 package org.apache.druid.query.expression;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import org.apache.druid.jackson.DefaultObjectMapper;
 import org.apache.druid.java.util.common.Pair;
 import org.apache.druid.math.expr.Expr;
 import org.apache.druid.math.expr.ExprEval;
@@ -38,6 +40,7 @@
 
 public class NestedDataExpressionsTest extends InitializedNullHandlingTest
 {
+  private static final ObjectMapper JSON_MAPPER = new DefaultObjectMapper();
   private static final ExprMacroTable MACRO_TABLE = new ExprMacroTable(
       ImmutableList.of(
           new NestedDataExpressions.StructExprMacro(),
@@ -50,8 +53,8 @@
           new NestedDataExpressions.JsonValueExprMacro(),
           new NestedDataExpressions.JsonQueryExprMacro(),
           new NestedDataExpressions.ToJsonExprMacro(),
-          new NestedDataExpressions.ToJsonStringExprMacro(),
-          new NestedDataExpressions.ParseJsonExprMacro()
+          new NestedDataExpressions.ToJsonStringExprMacro(JSON_MAPPER),
+          new NestedDataExpressions.ParseJsonExprMacro(JSON_MAPPER)
       )
   );
   private static final Map<String, Object> NEST = ImmutableMap.of(
diff --git a/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java b/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java
index 3b81187..95aecba 100644
--- a/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java
+++ b/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java
@@ -19,7 +19,9 @@
 
 package org.apache.druid.query.expression;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableList;
+import org.apache.druid.jackson.DefaultObjectMapper;
 import org.apache.druid.math.expr.ExprMacroTable;
 
 public class TestExprMacroTable extends ExprMacroTable
@@ -28,6 +30,11 @@
 
   private TestExprMacroTable()
   {
+    this(new DefaultObjectMapper());
+  }
+
+  private TestExprMacroTable(ObjectMapper jsonMapper)
+  {
     super(
         ImmutableList.of(
             new IPv4AddressMatchExprMacro(),
@@ -56,8 +63,8 @@
             new NestedDataExpressions.JsonValueExprMacro(),
             new NestedDataExpressions.JsonQueryExprMacro(),
             new NestedDataExpressions.ToJsonExprMacro(),
-            new NestedDataExpressions.ToJsonStringExprMacro(),
-            new NestedDataExpressions.ParseJsonExprMacro()
+            new NestedDataExpressions.ToJsonStringExprMacro(jsonMapper),
+            new NestedDataExpressions.ParseJsonExprMacro(jsonMapper)
         )
     );
   }
