This is an automated email from the ASF dual-hosted git repository.

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 9beb63049f Remove abuse of new ObjectMapper. (#8736)
9beb63049f is described below

commit 9beb63049fd8e19c08c8fba137547f2c58dc9ca5
Author: Gonzalo Ortiz Jaureguizar <[email protected]>
AuthorDate: Wed May 25 18:58:42 2022 +0200

    Remove abuse of new ObjectMapper. (#8736)
---
 .../LiteralOnlyBrokerRequestTest.java               | 15 +++++++--------
 .../java/org/apache/pinot/client/BrokerCache.java   |  5 ++---
 .../org/apache/pinot/client/ExternalViewReader.java |  4 ++--
 .../client/JsonAsyncHttpPinotClientTransport.java   |  4 ++--
 .../pinot/client/AggregationResultSetTest.java      |  5 ++---
 .../org/apache/pinot/client/ExecutionStatsTest.java |  5 ++---
 .../apache/pinot/client/GroupByResultSetTest.java   |  5 ++---
 .../org/apache/pinot/client/ResultSetGroupTest.java |  4 ++--
 .../pinot/client/ResultTableResultSetTest.java      |  5 ++---
 .../apache/pinot/client/SelectionResultSetTest.java |  5 ++---
 .../pinot/client/PinotConnectionMetaData.java       | 10 ++++------
 .../org/apache/pinot/client/PinotResultSet.java     |  4 ++--
 .../response/ControllerTenantBrokerResponse.java    |  7 ++-----
 .../client/controller/response/SchemaResponse.java  |  7 ++-----
 .../client/controller/response/TableResponse.java   |  7 ++-----
 .../pinot/client/DummyPinotControllerTransport.java |  5 ++---
 .../org/apache/pinot/client/PinotResultSetTest.java |  4 ++--
 .../segment/generation/SegmentGenerationUtils.java  |  9 +++------
 .../apache/pinot/common/utils/PinotAppConfigs.java  |  5 ++---
 .../pinot/common/function/JsonFunctionsTest.java    | 10 ++++------
 .../pinot/common/utils/config/TableConfigTest.java  |  6 ++----
 .../api/resources/TableDebugResource.java           |  3 +--
 .../controller/recommender/RecommenderDriver.java   |  1 +
 .../controller/recommender/io/InputManager.java     |  9 +++------
 .../api/PinotControllerAppConfigsTest.java          |  7 +++----
 .../controller/recommender/TestConfigEngine.java    |  7 +++----
 .../common/evaluators/DefaultJsonPathEvaluator.java |  1 +
 .../JsonExtractScalarTransformFunction.java         |  1 +
 .../batch/common/SegmentGenerationTaskRunner.java   |  3 +--
 .../ingestion/common/DefaultControllerRestApi.java  |  4 +---
 .../plugin/provider/AzureEnvironmentProvider.java   |  5 ++---
 .../inputformat/avro/AvroRecordExtractorTest.java   |  7 ++-----
 .../plugin/inputformat/json/JSONMessageDecoder.java |  6 +-----
 .../stream/kafka/KafkaJSONMessageDecoderTest.java   |  6 ++----
 .../pinot/server/api/PinotServerAppConfigsTest.java |  7 +++----
 .../pinot/spi/data/readers/RecordReaderFactory.java |  3 +--
 .../java/org/apache/pinot/spi/utils/JsonUtils.java  | 21 ++++++++++++++-------
 37 files changed, 92 insertions(+), 130 deletions(-)

diff --git 
a/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/LiteralOnlyBrokerRequestTest.java
 
b/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/LiteralOnlyBrokerRequestTest.java
index 90d611b132..0868213cb4 100644
--- 
a/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/LiteralOnlyBrokerRequestTest.java
+++ 
b/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/LiteralOnlyBrokerRequestTest.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.broker.requesthandler;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.Collections;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
@@ -33,6 +32,7 @@ import org.apache.pinot.spi.metrics.PinotMetricUtils;
 import org.apache.pinot.spi.trace.RequestContext;
 import org.apache.pinot.spi.trace.Tracing;
 import org.apache.pinot.spi.utils.BytesUtils;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.sql.parsers.CalciteSqlParser;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -128,7 +128,7 @@ public class LiteralOnlyBrokerRequestTest {
     byte[] randBytes = new byte[12];
     RANDOM.nextBytes(randBytes);
     String ranStr = BytesUtils.toHexString(randBytes);
-    JsonNode request = new 
ObjectMapper().readTree(String.format("{\"sql\":\"SELECT %d, '%s'\"}", randNum, 
ranStr));
+    JsonNode request = 
JsonUtils.stringToJsonNode(String.format("{\"sql\":\"SELECT %d, '%s'\"}", 
randNum, ranStr));
     RequestContext requestStats = Tracing.getTracer().createRequestScope();
     BrokerResponseNative brokerResponse = 
requestHandler.handleRequest(request, null, requestStats);
     
Assert.assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnName(0),
 String.format("%d", randNum));
@@ -152,7 +152,7 @@ public class LiteralOnlyBrokerRequestTest {
             new BrokerMetrics("", PinotMetricUtils.getPinotMetricsRegistry(), 
true, Collections.emptySet()),
             null, null);
     long currentTsMin = System.currentTimeMillis();
-    JsonNode request = new ObjectMapper().readTree(
+    JsonNode request = JsonUtils.stringToJsonNode(
         "{\"sql\":\"SELECT now() as currentTs, fromDateTime('2020-01-01 UTC', 
'yyyy-MM-dd z') as firstDayOf2020\"}");
     RequestContext requestStats = Tracing.getTracer().createRequestScope();
     BrokerResponseNative brokerResponse = 
requestHandler.handleRequest(request, null, requestStats);
@@ -171,7 +171,7 @@ public class LiteralOnlyBrokerRequestTest {
     Assert.assertEquals(brokerResponse.getTotalDocs(), 0);
 
     long oneHourAgoTsMin = System.currentTimeMillis() - ONE_HOUR_IN_MS;
-    request = new ObjectMapper().readTree(
+    request = JsonUtils.stringToJsonNode(
         "{\"sql\":\"SELECT ago('PT1H') as oneHourAgoTs, 
fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') as "
             + "firstDayOf2020\"}");
     requestStats = Tracing.getTracer().createRequestScope();
@@ -192,7 +192,7 @@ public class LiteralOnlyBrokerRequestTest {
     Assert.assertEquals(brokerResponse.getResultTable().getRows().get(0)[1], 
1577836800000L);
     Assert.assertEquals(brokerResponse.getTotalDocs(), 0);
 
-    request = new ObjectMapper().readTree(
+    request = JsonUtils.stringToJsonNode(
         "{\"sql\":\"SELECT encodeUrl('key1=value 
1&key2=value@!$2&key3=value%3') AS encoded, "
             + 
"decodeUrl('key1%3Dvalue+1%26key2%3Dvalue%40%21%242%26key3%3Dvalue%253') AS 
decoded\"}");
     requestStats = Tracing.getTracer().createRequestScope();
@@ -222,9 +222,8 @@ public class LiteralOnlyBrokerRequestTest {
             new BrokerMetrics("", PinotMetricUtils.getPinotMetricsRegistry(), 
true, Collections.emptySet()),
             null, null);
 
-    ObjectMapper objectMapper = new ObjectMapper();
     // Test 1: select constant
-    JsonNode request = objectMapper.readTree("{\"sql\":\"EXPLAIN PLAN FOR 
SELECT 1.5, 'test'\"}");
+    JsonNode request = JsonUtils.stringToJsonNode("{\"sql\":\"EXPLAIN PLAN FOR 
SELECT 1.5, 'test'\"}");
     RequestContext requestStats = Tracing.getTracer().createRequestScope();
     BrokerResponseNative brokerResponse = 
requestHandler.handleRequest(request, null, requestStats);
 
@@ -242,7 +241,7 @@ public class LiteralOnlyBrokerRequestTest {
 
     // Test 2: invoke compile time function -> literal only
     long currentTsMin = System.currentTimeMillis();
-    request = objectMapper.readTree(
+    request = JsonUtils.stringToJsonNode(
         "{\"sql\":\"EXPLAIN PLAN FOR SELECT 6+8 as addition, 
fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') as "
             + "firstDayOf2020\"}");
     requestStats = Tracing.getTracer().createRequestScope();
diff --git 
a/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/BrokerCache.java
 
b/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/BrokerCache.java
index 8f296d3d9c..57a69593e2 100644
--- 
a/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/BrokerCache.java
+++ 
b/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/BrokerCache.java
@@ -20,7 +20,6 @@ package org.apache.pinot.client;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -31,6 +30,7 @@ import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.spi.utils.builder.ControllerRequestURLBuilder;
 import org.apache.pinot.spi.utils.builder.TableNameBuilder;
 import org.asynchttpclient.AsyncHttpClient;
@@ -70,7 +70,6 @@ public class BrokerCache {
   private static final TypeReference<Map<String, List<BrokerInstance>>> 
RESPONSE_TYPE_REF =
       new TypeReference<Map<String, List<BrokerInstance>>>() {
       };
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
   private final Random _random = new Random();
   private final AsyncHttpClient _client;
   private final String _address;
@@ -88,7 +87,7 @@ public class BrokerCache {
     Future<Response> responseFuture = getRequest.addHeader("accept", 
"application/json").execute();
     Response response = responseFuture.get();
     String responseBody = response.getResponseBody(StandardCharsets.UTF_8);
-    return OBJECT_MAPPER.readValue(responseBody, RESPONSE_TYPE_REF);
+    return JsonUtils.stringToObject(responseBody, RESPONSE_TYPE_REF);
   }
 
   private BrokerData getBrokerData(Map<String, List<BrokerInstance>> 
responses) {
diff --git 
a/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/ExternalViewReader.java
 
b/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/ExternalViewReader.java
index 32bd125780..88ed54976c 100644
--- 
a/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/ExternalViewReader.java
+++ 
b/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/ExternalViewReader.java
@@ -20,7 +20,6 @@ package org.apache.pinot.client;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectReader;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
@@ -38,6 +37,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.zip.GZIPInputStream;
 import org.I0Itec.zkclient.ZkClient;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +47,7 @@ import org.slf4j.LoggerFactory;
  */
 public class ExternalViewReader {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(ExternalViewReader.class);
-  private static final ObjectReader OBJECT_READER = new 
ObjectMapper().reader();
+  private static final ObjectReader OBJECT_READER = JsonUtils.DEFAULT_READER;
   public static final String BROKER_EXTERNAL_VIEW_PATH = 
"/EXTERNALVIEW/brokerResource";
   public static final String BROKER_INSTANCE_PATH = "/CONFIGS/PARTICIPANT";
   public static final String REALTIME_SUFFIX = "_REALTIME";
diff --git 
a/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/JsonAsyncHttpPinotClientTransport.java
 
b/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/JsonAsyncHttpPinotClientTransport.java
index 2c52626302..71ea4b4262 100644
--- 
a/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/JsonAsyncHttpPinotClientTransport.java
+++ 
b/pinot-clients/pinot-java-client/src/main/java/org/apache/pinot/client/JsonAsyncHttpPinotClientTransport.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pinot.client;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectReader;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -35,6 +34,7 @@ import java.util.concurrent.TimeUnit;
 import javax.annotation.Nullable;
 import javax.net.ssl.SSLContext;
 import org.apache.pinot.spi.utils.CommonConstants;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.asynchttpclient.AsyncHttpClient;
 import org.asynchttpclient.BoundRequestBuilder;
 import org.asynchttpclient.DefaultAsyncHttpClientConfig.Builder;
@@ -49,7 +49,7 @@ import org.slf4j.LoggerFactory;
  */
 public class JsonAsyncHttpPinotClientTransport implements PinotClientTransport 
{
   private static final Logger LOGGER = 
LoggerFactory.getLogger(JsonAsyncHttpPinotClientTransport.class);
-  private static final ObjectReader OBJECT_READER = new 
ObjectMapper().reader();
+  private static final ObjectReader OBJECT_READER = JsonUtils.DEFAULT_READER;
 
   private final Map<String, String> _headers;
   private final String _scheme;
diff --git 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/AggregationResultSetTest.java
 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/AggregationResultSetTest.java
index b3af907f44..e0c095ea41 100644
--- 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/AggregationResultSetTest.java
+++ 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/AggregationResultSetTest.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -37,8 +37,7 @@ public class AggregationResultSetTest {
   public void setUp()
       throws Exception {
     String jsonString = "{\"function\":\"testFunction\", \"value\":\"123\"}";
-    ObjectMapper objectMapper = new ObjectMapper();
-    _mockJsonObject = objectMapper.readTree(jsonString);
+    _mockJsonObject = JsonUtils.stringToJsonNode(jsonString);
     _aggregationResultSetUnderTest = new AggregationResultSet(_mockJsonObject);
   }
 
diff --git 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ExecutionStatsTest.java
 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ExecutionStatsTest.java
index 476bea869e..583a28e5ff 100644
--- 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ExecutionStatsTest.java
+++ 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ExecutionStatsTest.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -44,8 +44,7 @@ public class ExecutionStatsTest {
             + "\"numSegmentsProcessed\":10, \"numSegmentsMatched\":10, 
\"numConsumingSegmentsQueried\":10, "
             + "\"minConsumingFreshnessTimeMs\":10, \"totalDocs\":10, 
\"numGroupsLimitReached\":true, "
             + "\"timeUsedMs\":10}";
-    ObjectMapper objectMapper = new ObjectMapper();
-    _mockBrokerResponse = objectMapper.readTree(json);
+    _mockBrokerResponse = JsonUtils.stringToJsonNode(json);
     _executionStatsUnderTest = new ExecutionStats(_mockBrokerResponse);
   }
 
diff --git 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/GroupByResultSetTest.java
 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/GroupByResultSetTest.java
index 26d74639a5..accb42ca0f 100644
--- 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/GroupByResultSetTest.java
+++ 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/GroupByResultSetTest.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -39,8 +39,7 @@ public class GroupByResultSetTest {
     String jsonString =
         "{\"groupByResult\":[{\"value\":1, 
\"group\":[\"testGroup1\"]},{\"value\":2, \"group\":[\"testGroup2\"]}], "
             + "\"groupByColumns\":[\"testGroupColumn\"], 
\"function\":\"testFunction\"}";
-    ObjectMapper objectMapper = new ObjectMapper();
-    _mockJsonObject = objectMapper.readTree(jsonString);
+    _mockJsonObject = JsonUtils.stringToJsonNode(jsonString);
     _groupByResultSetUnderTest = new GroupByResultSet(_mockJsonObject);
   }
 
diff --git 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultSetGroupTest.java
 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultSetGroupTest.java
index d986a39e5e..c513587696 100644
--- 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultSetGroupTest.java
+++ 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultSetGroupTest.java
@@ -18,11 +18,11 @@
  */
 package org.apache.pinot.client;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.InputStream;
 import java.util.Collections;
 import java.util.Properties;
 import java.util.concurrent.Future;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -157,7 +157,7 @@ public class ResultSetGroupTest {
           lastByte = stream.read();
         }
         String jsonText = builder.toString();
-        return BrokerResponse.fromJson(new ObjectMapper().readTree(jsonText));
+        return BrokerResponse.fromJson(JsonUtils.stringToJsonNode(jsonText));
       } catch (Exception e) {
         Assert.fail("Unexpected exception", e);
         return null;
diff --git 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultTableResultSetTest.java
 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultTableResultSetTest.java
index 6e05773766..e57514f71f 100644
--- 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultTableResultSetTest.java
+++ 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/ResultTableResultSetTest.java
@@ -19,8 +19,8 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.List;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
@@ -41,8 +41,7 @@ public class ResultTableResultSetTest {
     String json =
         "{ \"rows\" : [[\"r1c1\", \"r1c2\"], [\"r2c1\", \"r2c2\"]], 
\"dataSchema\" : {\"columnNames\":[\"column1\", "
             + "\"column2\"], " + "\"columnDataTypes\":[\"column1DataType\", 
\"column2DataType\"]} } ";
-    ObjectMapper objectMapper = new ObjectMapper();
-    _jsonNode = objectMapper.readTree(json);
+    _jsonNode = JsonUtils.stringToJsonNode(json);
     _resultTableResultSetUnderTest = new ResultTableResultSet(_jsonNode);
   }
 
diff --git 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/SelectionResultSetTest.java
 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/SelectionResultSetTest.java
index 6de0fcbe03..0fb7a7a504 100644
--- 
a/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/SelectionResultSetTest.java
+++ 
b/pinot-clients/pinot-java-client/src/test/java/org/apache/pinot/client/SelectionResultSetTest.java
@@ -19,7 +19,7 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -37,8 +37,7 @@ public class SelectionResultSetTest {
   public void setUp()
       throws Exception {
     String jsonString = "{\"results\":[[\"r1c1\",\"r1c2\"]], 
\"columns\":[\"column1\", \"column2\"]}";
-    ObjectMapper objectMapper = new ObjectMapper();
-    _mockSelectionResults = objectMapper.readTree(jsonString);
+    _mockSelectionResults = JsonUtils.stringToJsonNode(jsonString);
     _selectionResultSetUnderTest = new 
SelectionResultSet(_mockSelectionResults);
   }
 
diff --git 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotConnectionMetaData.java
 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotConnectionMetaData.java
index 97fa53c390..30f13d2b0c 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotConnectionMetaData.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotConnectionMetaData.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -31,6 +30,7 @@ import 
org.apache.pinot.client.controller.PinotControllerTransport;
 import org.apache.pinot.client.controller.response.SchemaResponse;
 import org.apache.pinot.client.controller.response.TableResponse;
 import org.apache.pinot.client.utils.DriverUtils;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,8 +40,6 @@ import static org.apache.pinot.client.utils.Constants.*;
 public class PinotConnectionMetaData extends AbstractBaseConnectionMetaData {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(PinotConnectionMetaData.class);
 
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
   private final PinotConnection _connection;
   private final PinotControllerTransport _controllerTransport;
   private final String _controllerURL;
@@ -114,7 +112,7 @@ public class PinotConnectionMetaData extends 
AbstractBaseConnectionMetaData {
         pinotMeta.addRow(Arrays.asList(row));
       }
 
-      JsonNode resultTable = OBJECT_MAPPER.valueToTree(pinotMeta);
+      JsonNode resultTable = JsonUtils.objectToJsonNode(pinotMeta);
       return PinotResultSet.fromResultTable(new 
ResultTableResultSet(resultTable));
     } catch (Exception e) {
       throw new SQLException(e);
@@ -144,7 +142,7 @@ public class PinotConnectionMetaData extends 
AbstractBaseConnectionMetaData {
     row.add(TABLE_TYPE);
     pinotMeta.addRow(row);
 
-    JsonNode resultTable = OBJECT_MAPPER.valueToTree(pinotMeta);
+    JsonNode resultTable = JsonUtils.objectToJsonNode(pinotMeta);
     return PinotResultSet.fromResultTable(new 
ResultTableResultSet(resultTable));
   }
 
@@ -180,7 +178,7 @@ public class PinotConnectionMetaData extends 
AbstractBaseConnectionMetaData {
       }
     }
 
-    JsonNode resultTable = OBJECT_MAPPER.valueToTree(pinotMeta);
+    JsonNode resultTable = JsonUtils.objectToJsonNode(pinotMeta);
     return PinotResultSet.fromResultTable(new 
ResultTableResultSet(resultTable));
   }
 
diff --git 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotResultSet.java
 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotResultSet.java
index 212a01c51b..3e900c64ea 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotResultSet.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/PinotResultSet.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -39,6 +38,7 @@ import java.util.Map;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.pinot.client.base.AbstractBaseResultSet;
 import org.apache.pinot.client.utils.DateTimeUtils;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,7 +79,7 @@ public class PinotResultSet extends AbstractBaseResultSet {
 
   public static PinotResultSet fromJson(String jsonText) {
     try {
-      JsonNode brokerResponse = new ObjectMapper().readTree(jsonText);
+      JsonNode brokerResponse = JsonUtils.stringToJsonNode(jsonText);
       ResultSet resultSet = new 
ResultTableResultSet(brokerResponse.get("resultTable"));
       return new PinotResultSet(resultSet);
     } catch (Exception e) {
diff --git 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/ControllerTenantBrokerResponse.java
 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/ControllerTenantBrokerResponse.java
index 1ba9068006..68d212aade 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/ControllerTenantBrokerResponse.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/ControllerTenantBrokerResponse.java
@@ -19,14 +19,13 @@
 package org.apache.pinot.client.controller.response;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.asynchttpclient.Response;
 
 
@@ -68,8 +67,6 @@ public class ControllerTenantBrokerResponse {
 
   public static class ControllerTenantBrokerResponseFuture
       extends ControllerResponseFuture<ControllerTenantBrokerResponse> {
-    private static final ObjectReader OBJECT_READER = new 
ObjectMapper().reader();
-
     public ControllerTenantBrokerResponseFuture(Future<Response> response, 
String url) {
       super(response, url);
     }
@@ -79,7 +76,7 @@ public class ControllerTenantBrokerResponse {
         throws ExecutionException {
       String response = getStringResponse(timeout, unit);
       try {
-        JsonNode jsonResponse = OBJECT_READER.readTree(response);
+        JsonNode jsonResponse = JsonUtils.stringToJsonNode(response);
         ControllerTenantBrokerResponse tableResponse = 
ControllerTenantBrokerResponse.fromJson(jsonResponse);
         return tableResponse;
       } catch (IOException e) {
diff --git 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/SchemaResponse.java
 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/SchemaResponse.java
index 76e737679e..27116a634a 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/SchemaResponse.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/SchemaResponse.java
@@ -19,12 +19,11 @@
 package org.apache.pinot.client.controller.response;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.asynchttpclient.Response;
 
 
@@ -69,8 +68,6 @@ public class SchemaResponse {
   }
 
   public static class SchemaResponseFuture extends 
ControllerResponseFuture<SchemaResponse> {
-    private static final ObjectReader OBJECT_READER = new 
ObjectMapper().reader();
-
     public SchemaResponseFuture(Future<Response> response, String url) {
       super(response, url);
     }
@@ -80,7 +77,7 @@ public class SchemaResponse {
         throws ExecutionException {
       String response = getStringResponse(timeout, unit);
       try {
-        JsonNode jsonResponse = OBJECT_READER.readTree(response);
+        JsonNode jsonResponse = JsonUtils.stringToJsonNode(response);
         return SchemaResponse.fromJson(jsonResponse);
       } catch (IOException e) {
         new ExecutionException(e);
diff --git 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/TableResponse.java
 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/TableResponse.java
index 8f41afcfca..7e4a1c35fc 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/TableResponse.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/main/java/org/apache/pinot/client/controller/response/TableResponse.java
@@ -19,14 +19,13 @@
 package org.apache.pinot.client.controller.response;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.asynchttpclient.Response;
 
 
@@ -72,8 +71,6 @@ public class TableResponse {
   }
 
   public static class TableResponseFuture extends 
ControllerResponseFuture<TableResponse> {
-    private static final ObjectReader OBJECT_READER = new 
ObjectMapper().reader();
-
     public TableResponseFuture(Future<Response> response, String url) {
       super(response, url);
     }
@@ -83,7 +80,7 @@ public class TableResponse {
         throws ExecutionException {
       String response = getStringResponse(timeout, unit);
       try {
-        JsonNode jsonResponse = OBJECT_READER.readTree(response);
+        JsonNode jsonResponse = JsonUtils.stringToJsonNode(response);
         TableResponse tableResponse = TableResponse.fromJson(jsonResponse);
         return tableResponse;
       } catch (IOException e) {
diff --git 
a/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/DummyPinotControllerTransport.java
 
b/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/DummyPinotControllerTransport.java
index 1993ce6ea2..0a11da3fc6 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/DummyPinotControllerTransport.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/DummyPinotControllerTransport.java
@@ -19,9 +19,9 @@
 package org.apache.pinot.client;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.pinot.client.controller.PinotControllerTransport;
 import 
org.apache.pinot.client.controller.response.ControllerTenantBrokerResponse;
+import org.apache.pinot.spi.utils.JsonUtils;
 
 
 public class DummyPinotControllerTransport extends PinotControllerTransport {
@@ -30,8 +30,7 @@ public class DummyPinotControllerTransport extends 
PinotControllerTransport {
   public ControllerTenantBrokerResponse getBrokersFromController(String 
controllerAddress, String tenant) {
     try {
       String jsonString = "[{\"instanceName\": \"dummy\", \"host\" : 
\"dummy\", \"port\" : 8000}]";
-      ObjectMapper objectMapper = new ObjectMapper();
-      JsonNode dummyBrokerJsonResponse = objectMapper.readTree(jsonString);
+      JsonNode dummyBrokerJsonResponse = 
JsonUtils.stringToJsonNode(jsonString);
       return ControllerTenantBrokerResponse.fromJson(dummyBrokerJsonResponse);
     } catch (Exception e) {
     }
diff --git 
a/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/PinotResultSetTest.java
 
b/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/PinotResultSetTest.java
index 4c3c3cd9c0..7e92cc1040 100644
--- 
a/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/PinotResultSetTest.java
+++ 
b/pinot-clients/pinot-jdbc-client/src/test/java/org/apache/pinot/client/PinotResultSetTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pinot.client;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.InputStream;
 import java.sql.ResultSetMetaData;
 import java.util.Calendar;
@@ -27,6 +26,7 @@ import java.util.Date;
 import java.util.concurrent.Future;
 import org.apache.commons.io.IOUtils;
 import org.apache.pinot.client.utils.DateTimeUtils;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -181,7 +181,7 @@ public class PinotResultSetTest {
           lastByte = stream.read();
         }
         String jsonText = builder.toString();
-        return BrokerResponse.fromJson(new ObjectMapper().readTree(jsonText));
+        return BrokerResponse.fromJson(JsonUtils.stringToJsonNode(jsonText));
       } catch (Exception e) {
         Assert.fail("Unexpected exception", e);
         return null;
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/segment/generation/SegmentGenerationUtils.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/segment/generation/SegmentGenerationUtils.java
index 2eaeeefb5e..121f2da164 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/segment/generation/SegmentGenerationUtils.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/segment/generation/SegmentGenerationUtils.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.common.segment.generation;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Preconditions;
 import java.io.File;
 import java.io.IOException;
@@ -69,9 +68,8 @@ public class SegmentGenerationUtils {
     String schemaJson;
     if (PinotFSFactory.isSchemeSupported(scheme)) {
       // Try to use PinotFS to read schema URI
-      PinotFS pinotFS = PinotFSFactory.create(scheme);
       InputStream schemaStream;
-      try {
+      try (PinotFS pinotFS = PinotFSFactory.create(scheme)) {
         schemaStream = pinotFS.open(schemaURI);
       } catch (IOException e) {
         throw new RuntimeException("Failed to fetch schema from PinotFS - '" + 
schemaURI + "'", e);
@@ -112,8 +110,7 @@ public class SegmentGenerationUtils {
     String tableConfigJson;
     if (PinotFSFactory.isSchemeSupported(scheme)) {
       // Try to use PinotFS to read table config URI
-      PinotFS pinotFS = PinotFSFactory.create(scheme);
-      try {
+      try (PinotFS pinotFS = PinotFSFactory.create(scheme);) {
         tableConfigJson = IOUtils.toString(pinotFS.open(tableConfigURI), 
StandardCharsets.UTF_8);
       } catch (IOException e) {
         throw new RuntimeException("Failed to open table config file stream on 
Pinot fs - '" + tableConfigURI + "'", e);
@@ -129,7 +126,7 @@ public class SegmentGenerationUtils {
     // Controller API returns a wrapper of table config.
     JsonNode tableJsonNode;
     try {
-      tableJsonNode = new ObjectMapper().readTree(tableConfigJson);
+      tableJsonNode = JsonUtils.stringToJsonNode(tableConfigJson);
     } catch (IOException e) {
       throw new RuntimeException("Failed to decode table config into JSON from 
String - '" + tableConfigJson + "'", e);
     }
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/PinotAppConfigs.java 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/PinotAppConfigs.java
index 35d8e44800..6f93bf8a19 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/PinotAppConfigs.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/PinotAppConfigs.java
@@ -23,7 +23,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.lang.management.GarbageCollectorMXBean;
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryMXBean;
@@ -38,6 +37,7 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 import org.apache.commons.io.FileUtils;
 import org.apache.pinot.spi.env.PinotConfiguration;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.spi.utils.Obfuscator;
 
 
@@ -56,7 +56,6 @@ import org.apache.pinot.spi.utils.Obfuscator;
 @JsonPropertyOrder({"systemConfig", "runtimeConfig", "pinotConfig", 
"jvmConfig"})
 public class PinotAppConfigs {
   private static final String UNKNOWN_VALUE = "-";
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
   @JsonProperty("systemConfig")
   private SystemConfig _systemConfig;
@@ -341,7 +340,7 @@ public class PinotAppConfigs {
 
   public String toJSONString() {
     try {
-      return 
OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(new 
Obfuscator().toJson(this));
+      return JsonUtils.objectToPrettyString(new Obfuscator().toJson(this));
     } catch (JsonProcessingException e) {
       return e.getMessage();
     }
diff --git 
a/pinot-common/src/test/java/org/apache/pinot/common/function/JsonFunctionsTest.java
 
b/pinot-common/src/test/java/org/apache/pinot/common/function/JsonFunctionsTest.java
index 585afc9b7e..ee98705f10 100644
--- 
a/pinot-common/src/test/java/org/apache/pinot/common/function/JsonFunctionsTest.java
+++ 
b/pinot-common/src/test/java/org/apache/pinot/common/function/JsonFunctionsTest.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.common.function;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
@@ -27,6 +26,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import org.apache.pinot.common.function.scalar.JsonFunctions;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -254,8 +254,6 @@ public class JsonFunctionsTest {
     assertEquals(JsonFunctions.jsonPathArray(rawData, "$.[*].score"), new 
Integer[]{90, 50});
   }
 
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
   @DataProvider
   public static Object[][] jsonPathStringTestCases() {
     return new Object[][]{
@@ -268,14 +266,14 @@ public class JsonFunctionsTest {
   @Test(dataProvider = "jsonPathStringTestCases")
   public void testJsonPathString(Map<String, Object> map, String path, String 
expected)
       throws JsonProcessingException {
-    String value = 
JsonFunctions.jsonPathString(OBJECT_MAPPER.writeValueAsString(map), path);
+    String value = JsonFunctions.jsonPathString(JsonUtils.objectToString(map), 
path);
     assertEquals(value, expected);
   }
 
   @Test(dataProvider = "jsonPathStringTestCases")
   public void testJsonPathStringWithDefaultValue(Map<String, Object> map, 
String path, String expected)
       throws JsonProcessingException {
-    String value = 
JsonFunctions.jsonPathString(OBJECT_MAPPER.writeValueAsString(map), path, 
expected);
+    String value = JsonFunctions.jsonPathString(JsonUtils.objectToString(map), 
path, expected);
     assertEquals(value, expected);
   }
 
@@ -295,7 +293,7 @@ public class JsonFunctionsTest {
   @Test(dataProvider = "jsonPathArrayTestCases")
   public void testJsonPathArray(Map<String, Object> map, String path, Object[] 
expected)
       throws JsonProcessingException {
-    Object[] value = 
JsonFunctions.jsonPathArray(OBJECT_MAPPER.writeValueAsString(map), path);
+    Object[] value = 
JsonFunctions.jsonPathArray(JsonUtils.objectToString(map), path);
     if (expected == null) {
       assertNull(value);
     } else {
diff --git 
a/pinot-common/src/test/java/org/apache/pinot/common/utils/config/TableConfigTest.java
 
b/pinot-common/src/test/java/org/apache/pinot/common/utils/config/TableConfigTest.java
index ba4cc5238e..ffeef06aca 100644
--- 
a/pinot-common/src/test/java/org/apache/pinot/common/utils/config/TableConfigTest.java
+++ 
b/pinot-common/src/test/java/org/apache/pinot/common/utils/config/TableConfigTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pinot.common.utils.config;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -26,6 +25,7 @@ import java.nio.file.Paths;
 import java.util.stream.Stream;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.pinot.spi.config.table.TableConfig;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -34,8 +34,6 @@ import static org.testng.AssertJUnit.assertTrue;
 
 public class TableConfigTest {
 
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
   @DataProvider
   public Object[][] configs()
       throws IOException {
@@ -55,7 +53,7 @@ public class TableConfigTest {
   @Test(dataProvider = "configs")
   public void testConfigNotRejected(byte[] config)
       throws IOException {
-    TableConfig tableConfig = 
OBJECT_MAPPER.readerFor(TableConfig.class).readValue(config);
+    TableConfig tableConfig = 
JsonUtils.DEFAULT_READER.forType(TableConfig.class).readValue(config);
     assertTrue(StringUtils.isNotBlank(tableConfig.getTableName()));
   }
 }
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableDebugResource.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableDebugResource.java
index e3f2b349fd..d82221b4b3 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableDebugResource.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableDebugResource.java
@@ -20,7 +20,6 @@ package org.apache.pinot.controller.api.resources;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.BiMap;
 import io.swagger.annotations.Api;
@@ -132,7 +131,7 @@ public class TableDebugResource {
       tableDebugInfos.add(debugTable(_pinotHelixResourceManager, tableName, 
type, verbosity));
     }
 
-    return new 
ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(tableDebugInfos);
+    return JsonUtils.objectToPrettyString(tableDebugInfos);
   }
 
   /**
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/RecommenderDriver.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/RecommenderDriver.java
index 71cf3f8375..86e15939df 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/RecommenderDriver.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/RecommenderDriver.java
@@ -53,6 +53,7 @@ public class RecommenderDriver {
 
     InputManager inputManager;
     ConfigManager outputManager;
+    // This ObjectMapper requires special configurations, hence we can't use 
pinot JsonUtils here.
     ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
 
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
index dc5deab407..c6bbea84e4 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
@@ -23,8 +23,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonSetter;
 import com.fasterxml.jackson.annotation.Nulls;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
 import com.google.common.annotations.VisibleForTesting;
 import java.io.IOException;
 import java.util.HashMap;
@@ -59,6 +57,7 @@ import org.apache.pinot.spi.data.DimensionFieldSpec;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.apache.pinot.spi.data.MetricFieldSpec;
 import org.apache.pinot.spi.data.Schema;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.sql.parsers.CalciteSqlCompiler;
 import org.apache.pinot.sql.parsers.CalciteSqlParser;
 import org.apache.pinot.sql.parsers.SqlCompilationException;
@@ -337,11 +336,9 @@ public class InputManager {
   @JsonSetter(nulls = Nulls.SKIP)
   public void setSchema(JsonNode jsonNode)
       throws IOException {
-    ObjectReader reader = new ObjectMapper().readerFor(Schema.class);
-    _schema = reader.readValue(jsonNode);
+    _schema = JsonUtils.jsonNodeToObject(jsonNode, Schema.class);
     SchemaUtils.validate(_schema);
-    reader = new ObjectMapper().readerFor(SchemaWithMetaData.class);
-    _schemaWithMetaData = reader.readValue(jsonNode);
+    _schemaWithMetaData = JsonUtils.jsonNodeToObject(jsonNode, 
SchemaWithMetaData.class);
     _schemaWithMetaData.getDimensionFieldSpecs().forEach(fieldMetadata -> {
       _metaDataMap.put(fieldMetadata.getName(), fieldMetadata);
     });
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotControllerAppConfigsTest.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotControllerAppConfigsTest.java
index 5811ef6a2e..7b95a68dd4 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotControllerAppConfigsTest.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotControllerAppConfigsTest.java
@@ -18,11 +18,11 @@
  */
 package org.apache.pinot.controller.api;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import org.apache.pinot.common.utils.PinotAppConfigs;
 import org.apache.pinot.controller.ControllerConf;
 import org.apache.pinot.controller.helix.ControllerTest;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.spi.utils.Obfuscator;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
@@ -55,8 +55,7 @@ public class PinotControllerAppConfigsTest {
 
     String configsJson =
         
ControllerTest.sendGetRequest(TEST_INSTANCE.getControllerRequestURLBuilder().forAppConfigs());
-    ObjectMapper mapper = new ObjectMapper();
-    PinotAppConfigs actual = mapper.readValue(configsJson, 
PinotAppConfigs.class);
+    PinotAppConfigs actual = JsonUtils.stringToObject(configsJson, 
PinotAppConfigs.class);
 
     // RuntimeConfig is not checked as it has information that can change 
during the test run.
     // Also, some of the system configs can change, so compare the ones that 
don't.
@@ -72,7 +71,7 @@ public class PinotControllerAppConfigsTest {
     // tests Equals on obfuscated expected and actual
     Obfuscator obfuscator = new Obfuscator();
     String obfuscatedExpectedJson = obfuscator.toJsonString(expected);
-    PinotAppConfigs obfuscatedExpected = 
mapper.readValue(obfuscatedExpectedJson, PinotAppConfigs.class);
+    PinotAppConfigs obfuscatedExpected = 
JsonUtils.stringToObject(obfuscatedExpectedJson, PinotAppConfigs.class);
     Assert.assertEquals(actual.getJvmConfig(), 
obfuscatedExpected.getJvmConfig());
     Assert.assertEquals(actual.getPinotConfig(), 
obfuscatedExpected.getPinotConfig());
   }
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
index c99492d7bb..7f96d8378b 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pinot.controller.recommender;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
@@ -40,6 +39,7 @@ import 
org.apache.pinot.controller.recommender.rules.io.configs.SegmentSizeRecom
 import org.apache.pinot.controller.recommender.rules.utils.FixedLenBitset;
 import 
org.apache.pinot.controller.recommender.rules.utils.QueryInvertedSortedIndexRecommender;
 import org.apache.pinot.spi.data.FieldSpec;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
@@ -52,12 +52,11 @@ import static org.testng.Assert.*;
 public class TestConfigEngine {
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(TestConfigEngine.class);
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
   private InputManager _input;
 
   void loadInput(String fName)
       throws InvalidInputException, IOException {
-    _input = OBJECT_MAPPER.readValue(readInputToStr(fName), 
InputManager.class);
+    _input = JsonUtils.stringToObject(readInputToStr(fName), 
InputManager.class);
     _input.init();
   }
 
@@ -500,7 +499,7 @@ public class TestConfigEngine {
       throws IOException, InvalidInputException {
     String input = readInputToStr(fileName);
     String output = RecommenderDriver.run(input);
-    return OBJECT_MAPPER.readValue(output, ConfigManager.class);
+    return JsonUtils.stringToObject(output, ConfigManager.class);
   }
 
   private void assertRealtimeProvisioningRecommendation(Map<String, String> 
matrix) {
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/common/evaluators/DefaultJsonPathEvaluator.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/common/evaluators/DefaultJsonPathEvaluator.java
index 75f70d7230..9e586961e3 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/common/evaluators/DefaultJsonPathEvaluator.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/common/evaluators/DefaultJsonPathEvaluator.java
@@ -41,6 +41,7 @@ import org.apache.pinot.spi.utils.JsonUtils;
 
 public final class DefaultJsonPathEvaluator implements JsonPathEvaluator {
 
+  // This ObjectMapper requires special configurations, hence we can't use 
pinot JsonUtils here.
   private static final ObjectMapper OBJECT_MAPPER_WITH_BIG_DECIMAL = new 
ObjectMapper()
       .configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
 
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunction.java
index b30774a5f1..0d93e5038c 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunction.java
@@ -56,6 +56,7 @@ import org.apache.pinot.spi.utils.JsonUtils;
 public class JsonExtractScalarTransformFunction extends BaseTransformFunction {
   public static final String FUNCTION_NAME = "jsonExtractScalar";
 
+  // This ObjectMapper requires special configurations, hence we can't use 
pinot JsonUtils here.
   private static final ObjectMapper OBJECT_MAPPER_WITH_BIG_DECIMAL = new 
ObjectMapper()
       .configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
 
diff --git 
a/pinot-plugins/pinot-batch-ingestion/pinot-batch-ingestion-common/src/main/java/org/apache/pinot/plugin/ingestion/batch/common/SegmentGenerationTaskRunner.java
 
b/pinot-plugins/pinot-batch-ingestion/pinot-batch-ingestion-common/src/main/java/org/apache/pinot/plugin/ingestion/batch/common/SegmentGenerationTaskRunner.java
index 8757040df5..1dd0c6b9d5 100644
--- 
a/pinot-plugins/pinot-batch-ingestion/pinot-batch-ingestion-common/src/main/java/org/apache/pinot/plugin/ingestion/batch/common/SegmentGenerationTaskRunner.java
+++ 
b/pinot-plugins/pinot-batch-ingestion/pinot-batch-ingestion-common/src/main/java/org/apache/pinot/plugin/ingestion/batch/common/SegmentGenerationTaskRunner.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.plugin.ingestion.batch.common;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.Serializable;
 import java.net.URISyntaxException;
 import java.util.HashMap;
@@ -93,7 +92,7 @@ public class SegmentGenerationTaskRunner implements 
Serializable {
       if (configs == null) {
         configs = new HashMap<>();
       }
-      JsonNode jsonNode = new ObjectMapper().valueToTree(configs);
+      JsonNode jsonNode = JsonUtils.objectToJsonNode(configs);
       Class<?> clazz = PluginManager.get().loadClass(readerConfigClassName);
       recordReaderConfig = (RecordReaderConfig) 
JsonUtils.jsonNodeToObject(jsonNode, clazz);
     }
diff --git 
a/pinot-plugins/pinot-batch-ingestion/v0_deprecated/pinot-ingestion-common/src/main/java/org/apache/pinot/ingestion/common/DefaultControllerRestApi.java
 
b/pinot-plugins/pinot-batch-ingestion/v0_deprecated/pinot-ingestion-common/src/main/java/org/apache/pinot/ingestion/common/DefaultControllerRestApi.java
index f1006d3c28..ef75fc2038 100644
--- 
a/pinot-plugins/pinot-batch-ingestion/v0_deprecated/pinot-ingestion-common/src/main/java/org/apache/pinot/ingestion/common/DefaultControllerRestApi.java
+++ 
b/pinot-plugins/pinot-batch-ingestion/v0_deprecated/pinot-ingestion-common/src/main/java/org/apache/pinot/ingestion/common/DefaultControllerRestApi.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.ingestion.common;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Preconditions;
 import java.io.IOException;
 import java.io.InputStream;
@@ -184,14 +183,13 @@ public class DefaultControllerRestApi implements 
ControllerRestApi {
   @Override
   public List<String> getAllSegments(String tableType) {
     LOGGER.info("Getting all segments of table {}", _rawTableName);
-    ObjectMapper objectMapper = new ObjectMapper();
     for (PushLocation pushLocation : _pushLocations) {
       try {
         SimpleHttpResponse response = 
_fileUploadDownloadClient.getHttpClient().sendGetRequest(FileUploadDownloadClient
             .getRetrieveAllSegmentWithTableTypeHttpUri(pushLocation.getHost(), 
pushLocation.getPort(), _rawTableName,
                 tableType));
         JsonNode segmentList = 
getSegmentsFromJsonSegmentAPI(response.getResponse(), tableType);
-        return objectMapper.convertValue(segmentList, ArrayList.class);
+        return JsonUtils.jsonNodeToObject(segmentList, ArrayList.class);
       } catch (Exception e) {
         LOGGER.warn("Caught exception while getting all {} segments for table: 
{} from push location: {}", tableType,
             _rawTableName, pushLocation, e);
diff --git 
a/pinot-plugins/pinot-environment/pinot-azure/src/main/java/org/apache/pinot/plugin/provider/AzureEnvironmentProvider.java
 
b/pinot-plugins/pinot-environment/pinot-azure/src/main/java/org/apache/pinot/plugin/provider/AzureEnvironmentProvider.java
index 234c5d37c1..5bf772e4db 100644
--- 
a/pinot-plugins/pinot-environment/pinot-azure/src/main/java/org/apache/pinot/plugin/provider/AzureEnvironmentProvider.java
+++ 
b/pinot-plugins/pinot-environment/pinot-azure/src/main/java/org/apache/pinot/plugin/provider/AzureEnvironmentProvider.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.plugin.provider;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import java.io.IOException;
@@ -40,6 +39,7 @@ import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 import org.apache.pinot.spi.env.PinotConfiguration;
 import org.apache.pinot.spi.environmentprovider.PinotEnvironmentProvider;
+import org.apache.pinot.spi.utils.JsonUtils;
 
 
 /**
@@ -107,9 +107,8 @@ public class AzureEnvironmentProvider implements 
PinotEnvironmentProvider {
 
     // For a sample response payload,
     // check 
https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service?tabs=linux
-    final ObjectMapper objectMapper = new ObjectMapper();
     try {
-      final JsonNode jsonNode = objectMapper.readTree(responsePayload);
+      final JsonNode jsonNode = JsonUtils.stringToJsonNode(responsePayload);
       final JsonNode computeNode = jsonNode.path(COMPUTE);
 
       if (computeNode.isMissingNode()) {
diff --git 
a/pinot-plugins/pinot-input-format/pinot-avro-base/src/test/java/org/apache/pinot/plugin/inputformat/avro/AvroRecordExtractorTest.java
 
b/pinot-plugins/pinot-input-format/pinot-avro-base/src/test/java/org/apache/pinot/plugin/inputformat/avro/AvroRecordExtractorTest.java
index 32469f01b3..7867aff1d1 100644
--- 
a/pinot-plugins/pinot-input-format/pinot-avro-base/src/test/java/org/apache/pinot/plugin/inputformat/avro/AvroRecordExtractorTest.java
+++ 
b/pinot-plugins/pinot-input-format/pinot-avro-base/src/test/java/org/apache/pinot/plugin/inputformat/avro/AvroRecordExtractorTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.pinot.plugin.inputformat.avro;
 
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import java.io.File;
 import java.io.IOException;
@@ -47,6 +45,7 @@ import org.apache.pinot.spi.data.FieldSpec;
 import org.apache.pinot.spi.data.readers.AbstractRecordExtractorTest;
 import org.apache.pinot.spi.data.readers.GenericRow;
 import org.apache.pinot.spi.data.readers.RecordReader;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -57,7 +56,6 @@ import static org.apache.avro.Schema.*;
  * Tests the {@link AvroRecordExtractor} using a schema containing groovy 
transform functions
  */
 public class AvroRecordExtractorTest extends AbstractRecordExtractorTest {
-  private static final ObjectMapper DEFAULT_MAPPER = new ObjectMapper();
   private final File _dataFile = new File(_tempDir, "events.avro");
 
   /**
@@ -123,8 +121,7 @@ public class AvroRecordExtractorTest extends 
AbstractRecordExtractorTest {
     Assert.assertEquals("Long", 
genericRow.getValue(testColumnName).getClass().getSimpleName());
 
     String jsonString = genericRecord.toString();
-    Map<String, Object> jsonMap = DEFAULT_MAPPER.readValue(jsonString, new 
TypeReference<Map<String, Object>>() {
-    });
+    Map<String, Object> jsonMap = JsonUtils.stringToObject(jsonString, 
JsonUtils.MAP_TYPE_REFERENCE);
     // The data type got changed to Integer, which will then have to trigger 
the convert method in
     // DataTypeTransformer class.
     Assert.assertEquals("Integer", 
jsonMap.get(testColumnName).getClass().getSimpleName());
diff --git 
a/pinot-plugins/pinot-input-format/pinot-json/src/main/java/org/apache/pinot/plugin/inputformat/json/JSONMessageDecoder.java
 
b/pinot-plugins/pinot-input-format/pinot-json/src/main/java/org/apache/pinot/plugin/inputformat/json/JSONMessageDecoder.java
index 822ac202ca..d3f52309b7 100644
--- 
a/pinot-plugins/pinot-input-format/pinot-json/src/main/java/org/apache/pinot/plugin/inputformat/json/JSONMessageDecoder.java
+++ 
b/pinot-plugins/pinot-input-format/pinot-json/src/main/java/org/apache/pinot/plugin/inputformat/json/JSONMessageDecoder.java
@@ -18,9 +18,7 @@
  */
 package org.apache.pinot.plugin.inputformat.json;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
@@ -38,7 +36,6 @@ import org.slf4j.LoggerFactory;
  */
 public class JSONMessageDecoder implements StreamMessageDecoder<byte[]> {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(JSONMessageDecoder.class);
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
   private static final String JSON_RECORD_EXTRACTOR_CLASS =
       "org.apache.pinot.plugin.inputformat.json.JSONRecordExtractor";
 
@@ -62,8 +59,7 @@ public class JSONMessageDecoder implements 
StreamMessageDecoder<byte[]> {
   public GenericRow decode(byte[] payload, GenericRow destination) {
     try {
       JsonNode message = JsonUtils.bytesToJsonNode(payload);
-      Map<String, Object> from = OBJECT_MAPPER.convertValue(message, new 
TypeReference<Map<String, Object>>() {
-      });
+      Map<String, Object> from = JsonUtils.jsonNodeToMap(message);
       _jsonRecordExtractor.extract(from, destination);
       return destination;
     } catch (Exception e) {
diff --git 
a/pinot-plugins/pinot-stream-ingestion/pinot-kafka-base/src/test/java/org/apache/pinot/plugin/stream/kafka/KafkaJSONMessageDecoderTest.java
 
b/pinot-plugins/pinot-stream-ingestion/pinot-kafka-base/src/test/java/org/apache/pinot/plugin/stream/kafka/KafkaJSONMessageDecoderTest.java
index 52ae75f537..dc4810d611 100644
--- 
a/pinot-plugins/pinot-stream-ingestion/pinot-kafka-base/src/test/java/org/apache/pinot/plugin/stream/kafka/KafkaJSONMessageDecoderTest.java
+++ 
b/pinot-plugins/pinot-stream-ingestion/pinot-kafka-base/src/test/java/org/apache/pinot/plugin/stream/kafka/KafkaJSONMessageDecoderTest.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.plugin.stream.kafka;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -28,14 +27,13 @@ import java.util.Map;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.apache.pinot.spi.data.Schema;
 import org.apache.pinot.spi.data.readers.GenericRow;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 
 public class KafkaJSONMessageDecoderTest {
 
-  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
   @Test
   public void testJsonDecoderWithoutOutgoingTimeSpec()
       throws Exception {
@@ -85,7 +83,7 @@ public class KafkaJSONMessageDecoderTest {
       GenericRow r = new GenericRow();
       String line = reader.readLine();
       while (line != null) {
-        JsonNode jsonNode = OBJECT_MAPPER.reader().readTree(line);
+        JsonNode jsonNode = JsonUtils.DEFAULT_READER.readTree(line);
         decoder.decode(line.getBytes(), r);
         for (String field : sourceFields.keySet()) {
           Object actualValue = r.getValue(field);
diff --git 
a/pinot-server/src/test/java/org/apache/pinot/server/api/PinotServerAppConfigsTest.java
 
b/pinot-server/src/test/java/org/apache/pinot/server/api/PinotServerAppConfigsTest.java
index 306e3dfa72..ad7bdcf2c6 100644
--- 
a/pinot-server/src/test/java/org/apache/pinot/server/api/PinotServerAppConfigsTest.java
+++ 
b/pinot-server/src/test/java/org/apache/pinot/server/api/PinotServerAppConfigsTest.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.server.api;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.net.SocketException;
 import java.net.UnknownHostException;
 import javax.ws.rs.core.Response;
@@ -27,6 +26,7 @@ import org.apache.pinot.common.utils.PinotAppConfigs;
 import org.apache.pinot.server.starter.helix.DefaultHelixStarterServerConfig;
 import org.apache.pinot.spi.env.PinotConfiguration;
 import org.apache.pinot.spi.utils.CommonConstants;
+import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.spi.utils.NetUtils;
 import org.apache.pinot.spi.utils.Obfuscator;
 import org.testng.Assert;
@@ -58,8 +58,7 @@ public class PinotServerAppConfigsTest extends 
BaseResourceTest {
 
     Response response = 
_webTarget.path("/appconfigs").request().get(Response.class);
     String configsJson = response.readEntity(String.class);
-    ObjectMapper mapper = new ObjectMapper();
-    PinotAppConfigs actual = mapper.readValue(configsJson, 
PinotAppConfigs.class);
+    PinotAppConfigs actual = JsonUtils.stringToObject(configsJson, 
PinotAppConfigs.class);
 
     // RuntimeConfig is not checked as it has information that can change 
during the test run.
     // Also, some of the system configs can change, so compare the ones that 
don't.
@@ -75,7 +74,7 @@ public class PinotServerAppConfigsTest extends 
BaseResourceTest {
     // tests Equals on obfuscated expected and actual
     Obfuscator obfuscator = new Obfuscator();
     String obfuscatedExpectedJson = obfuscator.toJsonString(expected);
-    PinotAppConfigs obfuscatedExpected = 
mapper.readValue(obfuscatedExpectedJson, PinotAppConfigs.class);
+    PinotAppConfigs obfuscatedExpected = 
JsonUtils.stringToObject(obfuscatedExpectedJson, PinotAppConfigs.class);
     Assert.assertEquals(actual.getJvmConfig(), 
obfuscatedExpected.getJvmConfig());
     Assert.assertEquals(actual.getPinotConfig(), 
obfuscatedExpected.getPinotConfig());
   }
diff --git 
a/pinot-spi/src/main/java/org/apache/pinot/spi/data/readers/RecordReaderFactory.java
 
b/pinot-spi/src/main/java/org/apache/pinot/spi/data/readers/RecordReaderFactory.java
index 7492af7ce9..fd7fa1c0f2 100644
--- 
a/pinot-spi/src/main/java/org/apache/pinot/spi/data/readers/RecordReaderFactory.java
+++ 
b/pinot-spi/src/main/java/org/apache/pinot/spi/data/readers/RecordReaderFactory.java
@@ -19,7 +19,6 @@
 package org.apache.pinot.spi.data.readers;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -132,7 +131,7 @@ public class RecordReaderFactory {
       throws ClassNotFoundException, IOException {
     String readerConfigClassName = 
getRecordReaderConfigClassName(fileFormat.toString());
     if (readerConfigClassName != null) {
-      JsonNode jsonNode = new ObjectMapper().valueToTree(configs);
+      JsonNode jsonNode = JsonUtils.objectToJsonNode(configs);
       Class<?> clazz = PluginManager.get().loadClass(readerConfigClassName);
       return (RecordReaderConfig) JsonUtils.jsonNodeToObject(jsonNode, clazz);
     }
diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/JsonUtils.java 
b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/JsonUtils.java
index f173d5ff13..13b638915d 100644
--- a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/JsonUtils.java
+++ b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/JsonUtils.java
@@ -81,12 +81,12 @@ public class JsonUtils {
   public static final ObjectReader DEFAULT_READER = DEFAULT_MAPPER.reader();
   public static final ObjectWriter DEFAULT_WRITER = DEFAULT_MAPPER.writer();
   public static final ObjectWriter DEFAULT_PRETTY_WRITER = 
DEFAULT_MAPPER.writerWithDefaultPrettyPrinter();
-  private static final TypeReference<HashMap<String, Object>> 
GENERIC_JSON_TYPE =
+  public static final TypeReference<HashMap<String, Object>> 
MAP_TYPE_REFERENCE =
       new TypeReference<HashMap<String, Object>>() {
       };
 
   public static <T> T stringToObject(String jsonString, Class<T> valueType)
-      throws IOException {
+      throws JsonProcessingException {
     return DEFAULT_READER.forType(valueType).readValue(jsonString);
   }
 
@@ -101,10 +101,10 @@ public class JsonUtils {
       Class<T> valueType)
       throws IOException {
     T instance = DEFAULT_READER.forType(valueType).readValue(jsonString);
-    Map<String, Object> inputJsonMap = 
flatten(DEFAULT_MAPPER.readValue(jsonString, GENERIC_JSON_TYPE));
+    Map<String, Object> inputJsonMap = 
flatten(DEFAULT_MAPPER.readValue(jsonString, MAP_TYPE_REFERENCE));
 
     String instanceJson = DEFAULT_MAPPER.writeValueAsString(instance);
-    Map<String, Object> instanceJsonMap = 
flatten(DEFAULT_MAPPER.readValue(instanceJson, GENERIC_JSON_TYPE));
+    Map<String, Object> instanceJsonMap = 
flatten(DEFAULT_MAPPER.readValue(instanceJson, MAP_TYPE_REFERENCE));
 
     MapDifference<String, Object> difference = Maps.difference(inputJsonMap, 
instanceJsonMap);
     return Pair.of(instance, difference.entriesOnlyOnLeft());
@@ -166,11 +166,12 @@ public class JsonUtils {
   /**
    * Reads the first json object from the file that can contain multiple 
objects
    */
+  @Nullable
   public static JsonNode fileToFirstJsonNode(File jsonFile)
       throws IOException {
-    try (InputStream inputStream = new FileInputStream(jsonFile)) {
-      JsonFactory jf = new JsonFactory();
-      JsonParser jp = jf.createParser(inputStream);
+    JsonFactory jf = new JsonFactory();
+    try (InputStream inputStream = new FileInputStream(jsonFile);
+        JsonParser jp = jf.createParser(inputStream)) {
       jp.setCodec(DEFAULT_MAPPER);
       jp.nextToken();
       if (jp.hasCurrentToken()) {
@@ -210,6 +211,11 @@ public class JsonUtils {
     return DEFAULT_READER.forType(valueTypeRef).readValue(jsonNode);
   }
 
+  public static Map<String, Object> jsonNodeToMap(JsonNode jsonNode)
+      throws IOException {
+    return DEFAULT_READER.forType(MAP_TYPE_REFERENCE).readValue(jsonNode);
+  }
+
   public static String objectToString(Object object)
       throws JsonProcessingException {
     return DEFAULT_WRITER.writeValueAsString(object);
@@ -475,6 +481,7 @@ public class JsonUtils {
     if (fieldsToUnnest == null) {
       fieldsToUnnest = new ArrayList<>();
     }
+    Preconditions.checkNotNull(jsonNode, "the JSON data shall be an object but 
it is null");
     Preconditions.checkState(jsonNode.isObject(), "the JSON data shall be an 
object");
     return getPinotSchemaFromJsonNode(jsonNode, fieldTypeMap, timeUnit, 
fieldsToUnnest, delimiter,
         collectionNotUnnestedToJson);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to