inject @Json ObjectMapper for to_json_string and parse_json expressions (#12900)

* inject @Json ObjectMapper for to_json_string and parse_json expressions

* fix npe

* better
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)
         )
     );
   }