瀏覽代碼

Remove Jackson dependence (#1113)

Signed-off-by: yhmo <yihua.mo@zilliz.com>
groot 6 月之前
父節點
當前提交
edaad143fa

+ 1 - 2
examples/main/java/io/milvus/v1/HighLevelExample.java

@@ -23,7 +23,6 @@ import com.google.gson.JsonObject;
 import com.google.common.collect.Lists;
 import io.milvus.client.MilvusServiceClient;
 import io.milvus.common.clientenum.ConsistencyLevelEnum;
-import io.milvus.common.utils.JacksonUtils;
 import io.milvus.common.utils.VectorUtils;
 import io.milvus.grpc.*;
 import io.milvus.param.*;
@@ -95,7 +94,7 @@ public class HighLevelExample {
 
         R<RpcStatus> response = milvusClient.createCollection(createSimpleCollectionParam);
         CommonUtils.handleResponseStatus(response);
-        System.out.println(JacksonUtils.toJsonString(response.getData()));
+        System.out.println(response);
         return response;
     }
 

+ 5 - 0
examples/pom.xml

@@ -83,6 +83,11 @@
             <version>1.7.36</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-csv</artifactId>
+            <version>2.16.1</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 0 - 21
pom.xml

@@ -89,7 +89,6 @@
         <maven.surefire.plugin.version>2.19.1</maven.surefire.plugin.version>
         <junit.platform.version>1.1.0</junit.platform.version>
         <junit.jupiter.engine.version>5.10.1</junit.jupiter.engine.version>
-        <jackson.version>2.16.1</jackson.version>
         <gson.version>2.10.1</gson.version>
         <kotlin.version>1.9.10</kotlin.version>
         <mockito.version>4.11.0</mockito.version>
@@ -126,21 +125,6 @@
                 <artifactId>slf4j-api</artifactId>
                 <version>${slf4j.api.version}</version>
             </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-databind</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-annotations</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-core</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
@@ -341,11 +325,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.dataformat</groupId>
-            <artifactId>jackson-dataformat-csv</artifactId>
-            <version>${jackson.version}</version>
-        </dependency>
 
         <!-- storage sdk-->
         <dependency>

+ 2 - 3
src/main/java/io/milvus/bulkwriter/Buffer.java

@@ -19,11 +19,11 @@
 
 package io.milvus.bulkwriter;
 
-import com.google.gson.*;
 import com.google.common.collect.Lists;
 import io.milvus.bulkwriter.common.clientenum.BulkFileType;
 import io.milvus.common.utils.ExceptionUtils;
 import io.milvus.bulkwriter.common.utils.ParquetUtils;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.grpc.DataType;
 import io.milvus.param.collection.CollectionSchemaParam;
 import io.milvus.param.collection.FieldType;
@@ -57,7 +57,6 @@ public class Buffer {
     private Map<String, List<Object>> buffer;
     private Map<String, FieldType> fields;
 
-    private static final Gson GSON_INSTANCE = new Gson();
 
     public Buffer(CollectionSchemaParam collectionSchema, BulkFileType fileType) {
         this.collectionSchema = collectionSchema;
@@ -312,7 +311,7 @@ public class Buffer {
 
     private static void addSparseVector(Group group, String fieldName, SortedMap<Long, Float> sparse) {
         // sparse vector is parsed as JSON format string in the server side
-        String jsonString = GSON_INSTANCE.toJson(sparse);
+        String jsonString = JsonUtils.toJson(sparse);
         group.append(fieldName, jsonString);
     }
 }

+ 7 - 8
src/main/java/io/milvus/bulkwriter/BulkImport.java

@@ -19,24 +19,23 @@
 
 package io.milvus.bulkwriter;
 
-import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import io.milvus.bulkwriter.request.describe.BaseDescribeImportRequest;
 import io.milvus.bulkwriter.request.import_.BaseImportRequest;
 import io.milvus.bulkwriter.request.list.BaseListImportJobsRequest;
 import io.milvus.bulkwriter.response.RestfulResponse;
+import io.milvus.common.utils.JsonUtils;
 
 import java.util.Map;
 
 public class BulkImport extends BaseBulkImport {
-    private static final Gson GSON_INSTANCE = new Gson();
 
     public static String bulkImport(String url, BaseImportRequest request) {
         String requestURL = url + "/v2/vectordb/jobs/import/create";
 
-        Map<String, Object> params = GSON_INSTANCE.fromJson(GSON_INSTANCE.toJson(request), new TypeToken<Map<String, Object>>() {}.getType());
+        Map<String, Object> params = JsonUtils.fromJson(JsonUtils.toJson(request), new TypeToken<Map<String, Object>>() {}.getType());
         String body = postRequest(requestURL, request.getApiKey(), params, 60 * 1000);
-        RestfulResponse<Object> response = GSON_INSTANCE.fromJson(body, new TypeToken<RestfulResponse<Object>>(){}.getType());
+        RestfulResponse<Object> response = JsonUtils.fromJson(body, new TypeToken<RestfulResponse<Object>>(){}.getType());
         handleResponse(requestURL, response);
         return body;
     }
@@ -44,9 +43,9 @@ public class BulkImport extends BaseBulkImport {
     public static String getImportProgress(String url, BaseDescribeImportRequest request) {
         String requestURL = url + "/v2/vectordb/jobs/import/describe";
 
-        Map<String, Object> params = GSON_INSTANCE.fromJson(GSON_INSTANCE.toJson(request), new TypeToken<Map<String, Object>>() {}.getType());
+        Map<String, Object> params = JsonUtils.fromJson(JsonUtils.toJson(request), new TypeToken<Map<String, Object>>() {}.getType());
         String body = postRequest(requestURL, request.getApiKey(), params, 60 * 1000);
-        RestfulResponse<Object> response = GSON_INSTANCE.fromJson(body, new TypeToken<RestfulResponse<Object>>(){}.getType());
+        RestfulResponse<Object> response = JsonUtils.fromJson(body, new TypeToken<RestfulResponse<Object>>(){}.getType());
         handleResponse(requestURL, response);
         return body;
     }
@@ -54,9 +53,9 @@ public class BulkImport extends BaseBulkImport {
     public static String listImportJobs(String url, BaseListImportJobsRequest request) {
         String requestURL = url + "/v2/vectordb/jobs/import/list";
 
-        Map<String, Object> params = GSON_INSTANCE.fromJson(GSON_INSTANCE.toJson(request), new TypeToken<Map<String, Object>>() {}.getType());
+        Map<String, Object> params = JsonUtils.fromJson(JsonUtils.toJson(request), new TypeToken<Map<String, Object>>() {}.getType());
         String body = postRequest(requestURL, request.getApiKey(), params, 60 * 1000);
-        RestfulResponse<Object> response = GSON_INSTANCE.fromJson(body, new TypeToken<RestfulResponse<Object>>(){}.getType());
+        RestfulResponse<Object> response = JsonUtils.fromJson(body, new TypeToken<RestfulResponse<Object>>(){}.getType());
         handleResponse(requestURL, response);
         return body;
     }

+ 0 - 2
src/main/java/io/milvus/bulkwriter/BulkWriter.java

@@ -51,8 +51,6 @@ public abstract class BulkWriter {
     protected Buffer buffer;
     protected ReentrantLock bufferLock;
 
-    private static final Gson GSON_INSTANCE = new Gson();
-
     protected BulkWriter(CollectionSchemaParam collectionSchema, int chunkSize, BulkFileType fileType) {
         this.collectionSchema = collectionSchema;
         this.chunkSize = chunkSize;

+ 2 - 2
src/main/java/io/milvus/client/AbstractMilvusGrpcClient.java

@@ -22,7 +22,7 @@ package io.milvus.client;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.*;
 import io.grpc.StatusRuntimeException;
-import io.milvus.common.utils.JacksonUtils;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.common.utils.VectorUtils;
 import io.milvus.exception.*;
 import io.milvus.grpc.*;
@@ -3288,7 +3288,7 @@ public abstract class AbstractMilvusGrpcClient implements MilvusClient {
                     .withOutFields(requestParam.getOutputFields())
                     .withExpr(requestParam.getFilter())
                     .withTopK(requestParam.getLimit())
-                    .withParams(JacksonUtils.toJsonString(requestParam.getParams()))
+                    .withParams(JsonUtils.toJson(requestParam.getParams()))
                     .withConsistencyLevel(requestParam.getConsistencyLevel())
                     .build();
 

+ 0 - 83
src/main/java/io/milvus/common/utils/JacksonUtils.java

@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package io.milvus.common.utils;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class JacksonUtils {
-
-    private static final ObjectMapper objectMapper;
-
-    static {
-        objectMapper = new ObjectMapper();
-        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
-    }
-
-    public static <T> T fromJson(String jsonStr, TypeReference<T> typeRef) {
-        try {
-            return objectMapper.readValue(jsonStr, typeRef);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("json deserialization error, e=", e);
-        }
-    }
-
-    public static <T> T fromJson(String jsonStr, Class<T> type) {
-        try {
-            return objectMapper.readValue(jsonStr, type);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("json deserialization error, e=", e);
-        }
-    }
-
-    public static <T> T fromJson(byte[] bytes, TypeReference<T> typeRef) {
-        try {
-            return objectMapper.readValue(bytes, typeRef);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("json deserialization error, e=", e);
-        }
-    }
-
-    public static <T> T fromJson(byte[] bytes, Class<T> type) {
-        try {
-            return objectMapper.readValue(bytes, type);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("json deserialization error, e=", e);
-        }
-    }
-
-    public static String toJsonString(Object obj) {
-        try {
-            return objectMapper.writeValueAsString(obj);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("json serialization error, e=", e);
-        }
-    }
-
-    public static byte[] toJsonByte(Object obj) {
-        try {
-            return objectMapper.writeValueAsBytes(obj);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("json serialization error, e=", e);
-        }
-    }
-
-}

+ 72 - 0
src/main/java/io/milvus/common/utils/JsonUtils.java

@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package io.milvus.common.utils;
+
+import com.google.gson.*;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+
+public class JsonUtils {
+    // Set ToNumberPolicy.LONG_OR_DOUBLE so that integer can be parsed as integer, float be parsed as float.
+    // Gson doc declared "Gson instances are Thread-safe so you can reuse them freely across multiple threads."
+    // So we can use it as a global static instance.
+    // https://www.javadoc.io/doc/com.google.code.gson/gson/2.10.1/com.google.gson/com/google/gson/Gson.html
+    private static final Gson GSON_INSTANCE = new GsonBuilder()
+            .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
+            .create();
+
+    public static <T> T fromJson(String jsonStr, Class<T> classOfT) {
+        return GSON_INSTANCE.fromJson(jsonStr, classOfT);
+    }
+
+    public static <T> T fromJson(String jsonStr, Type typeOfT) {
+        return GSON_INSTANCE.fromJson(jsonStr, typeOfT);
+    }
+
+    public static <T> T fromJson(String jsonStr, TypeToken<T> typeOfT) {
+        return GSON_INSTANCE.fromJson(jsonStr, typeOfT);
+    }
+
+
+    public static <T> T fromJson(JsonElement jsonElement, Class<T> classOfT) {
+        return GSON_INSTANCE.fromJson(jsonElement, classOfT);
+    }
+
+    public static <T> T fromJson(JsonElement jsonElement, Type typeOfT) {
+        return GSON_INSTANCE.fromJson(jsonElement, typeOfT);
+    }
+
+    public static <T> T fromJson(JsonElement jsonElement, TypeToken<T> typeOfT) {
+        return GSON_INSTANCE.fromJson(jsonElement, typeOfT);
+    }
+
+    public static String toJson(Object obj) {
+        return GSON_INSTANCE.toJson(obj);
+    }
+
+    public static String toJson(JsonElement jsonElement) {
+        return GSON_INSTANCE.toJson(jsonElement);
+    }
+
+    public static <T> JsonElement toJsonTree(T obj) {
+        return GSON_INSTANCE.toJsonTree(obj, new TypeToken<T>() {}.getType());
+    }
+}

+ 10 - 7
src/main/java/io/milvus/orm/iterator/SearchIterator.java

@@ -2,10 +2,10 @@ package io.milvus.orm.iterator;
 
 import com.amazonaws.util.CollectionUtils;
 import com.amazonaws.util.StringUtils;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.Lists;
+import com.google.gson.reflect.TypeToken;
 import io.milvus.common.utils.ExceptionUtils;
-import io.milvus.common.utils.JacksonUtils;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.exception.ParamException;
 import io.milvus.grpc.*;
 import io.milvus.param.MetricType;
@@ -146,8 +146,7 @@ public class SearchIterator {
         if (null != searchIteratorParam.getParams() && !searchIteratorParam.getParams().isEmpty()) {
             params = new HashMap<>();
         }
-        params = JacksonUtils.fromJson(searchIteratorParam.getParams(), new TypeReference<Map<String, Object>>() {
-        });
+        params = JsonUtils.fromJson(searchIteratorParam.getParams(), new TypeToken<Map<String, Object>>() {}.getType());
     }
 
     private void checkForSpecialIndexParam() {
@@ -246,7 +245,7 @@ public class SearchIterator {
                 .withExpr(nextExpr)
                 .withOutFields(searchIteratorParam.getOutFields())
                 .withRoundDecimal(searchIteratorParam.getRoundDecimal())
-                .withParams(JacksonUtils.toJsonString(params))
+                .withParams(JsonUtils.toJson(params))
                 .withMetricType(MetricType.valueOf(searchIteratorParam.getMetricType()))
                 .withIgnoreGrowing(searchIteratorParam.isIgnoreGrowing())
                 .withIterator(Boolean.TRUE)
@@ -403,8 +402,12 @@ public class SearchIterator {
 
     private Map<String, Object> nextParams(int coefficient) {
         coefficient = Math.max(1, coefficient);
-        Map<String, Object> nextParams = JacksonUtils.fromJson(JacksonUtils.toJsonString(params), new TypeReference<Map<String, Object>>() {
-        });
+
+        // Note: params is a Map<String, Object> to store the original parameters, we must not change the params.
+        // here we make a new object nextParams, to ensure is it a deep copy, we convert it to JSON string and
+        // convert back to a Map<String, Object>.
+        Map<String, Object> nextParams = JsonUtils.fromJson(JsonUtils.toJson(params),
+                new TypeToken<Map<String, Object>>() {}.getType());
 
         if (metricsPositiveRelated(metricType)) {
             float nextRadius = tailBand + width * coefficient;

+ 24 - 24
src/main/java/io/milvus/param/ParamUtils.java

@@ -23,7 +23,7 @@ import com.google.gson.*;
 import com.google.gson.reflect.TypeToken;
 import com.google.protobuf.ByteString;
 import io.milvus.common.clientenum.ConsistencyLevelEnum;
-import io.milvus.common.utils.JacksonUtils;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.exception.ParamException;
 import io.milvus.grpc.*;
 import io.milvus.param.collection.FieldType;
@@ -48,7 +48,6 @@ import java.util.stream.Collectors;
  * Utility functions for param classes
  */
 public class ParamUtils {
-    private static final Gson GSON_INSTANCE = new Gson();
 
     private static HashMap<DataType, String> getTypeErrorMsgForColumnInsert() {
         final HashMap<DataType, String> typeErrMsg = new HashMap<>();
@@ -344,7 +343,7 @@ public class ParamUtils {
                 }
                 int dim = fieldSchema.getDimension();
                 try {
-                    List<Float> vector = GSON_INSTANCE.fromJson(value, new TypeToken<List<Float>>() {}.getType());
+                    List<Float> vector = JsonUtils.fromJson(value, new TypeToken<List<Float>>() {}.getType());
                     if (vector.size() != dim) {
                         String msg = "Incorrect dimension for field '%s': dimension: %d is not equal to field's dimension: %d";
                         throw new ParamException(String.format(msg, fieldSchema.getName(), vector.size(), dim));
@@ -363,7 +362,7 @@ public class ParamUtils {
                 }
                 int dim = fieldSchema.getDimension();
                 try {
-                    byte[] v = GSON_INSTANCE.fromJson(value, new TypeToken<byte[]>() {}.getType());
+                    byte[] v = JsonUtils.fromJson(value, new TypeToken<byte[]>() {}.getType());
                     int real_dim = calculateBinVectorDim(dataType, v.length);
                     if (real_dim != dim) {
                         String msg = "Incorrect dimension for field '%s': dimension: %d is not equal to field's dimension: %d";
@@ -381,7 +380,7 @@ public class ParamUtils {
                 }
                 try {
                     // return SortedMap<Long, Float> for genFieldData()
-                    return GSON_INSTANCE.fromJson(value, new TypeToken<SortedMap<Long, Float>>() {}.getType());
+                    return JsonUtils.fromJson(value, new TypeToken<SortedMap<Long, Float>>() {}.getType());
                 } catch (JsonSyntaxException e) {
                     throw new ParamException(String.format("Unable to convert JsonObject to SortedMap<Long, Float> for field '%s'. Reason: %s",
                             fieldSchema.getName(), e.getCause().getMessage()));
@@ -449,19 +448,19 @@ public class ParamUtils {
         try {
             switch (elementType) {
                 case Int64:
-                    return GSON_INSTANCE.fromJson(jsonArray, new TypeToken<List<Long>>() {}.getType());
+                    return JsonUtils.fromJson(jsonArray, new TypeToken<List<Long>>() {}.getType());
                 case Int32:
                 case Int16:
                 case Int8:
-                    return GSON_INSTANCE.fromJson(jsonArray, new TypeToken<List<Integer>>() {}.getType());
+                    return JsonUtils.fromJson(jsonArray, new TypeToken<List<Integer>>() {}.getType());
                 case Bool:
-                    return GSON_INSTANCE.fromJson(jsonArray, new TypeToken<List<Boolean>>() {}.getType());
+                    return JsonUtils.fromJson(jsonArray, new TypeToken<List<Boolean>>() {}.getType());
                 case Float:
-                    return GSON_INSTANCE.fromJson(jsonArray, new TypeToken<List<Float>>() {}.getType());
+                    return JsonUtils.fromJson(jsonArray, new TypeToken<List<Float>>() {}.getType());
                 case Double:
-                    return GSON_INSTANCE.fromJson(jsonArray, new TypeToken<List<Double>>() {}.getType());
+                    return JsonUtils.fromJson(jsonArray, new TypeToken<List<Double>>() {}.getType());
                 case VarChar:
-                    return GSON_INSTANCE.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
+                    return JsonUtils.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
                 default:
                     throw new ParamException(String.format("Unsupported element type of Array field '%s'", fieldName));
             }
@@ -828,18 +827,19 @@ public class ParamUtils {
 
         if (null != requestParam.getParams() && !requestParam.getParams().isEmpty()) {
             try {
-            Map<String, Object> paramMap = JacksonUtils.fromJson(requestParam.getParams(),Map.class);
-            String offset = paramMap.getOrDefault(Constant.OFFSET, 0).toString();
-            builder.addSearchParams(
-                    KeyValuePair.newBuilder()
-                            .setKey(Constant.OFFSET)
-                            .setValue(offset)
-                            .build());
-            builder.addSearchParams(
-                    KeyValuePair.newBuilder()
-                            .setKey(Constant.PARAMS)
-                            .setValue(requestParam.getParams())
-                            .build());
+                Map<String, Object> paramMap = JsonUtils.fromJson(requestParam.getParams(),
+                        new TypeToken<Map<String, Object>>() {}.getType());
+                String offset = paramMap.getOrDefault(Constant.OFFSET, 0).toString();
+                builder.addSearchParams(
+                        KeyValuePair.newBuilder()
+                                .setKey(Constant.OFFSET)
+                                .setValue(offset)
+                                .build());
+                builder.addSearchParams(
+                        KeyValuePair.newBuilder()
+                                .setKey(Constant.PARAMS)
+                                .setValue(requestParam.getParams())
+                                .build());
             } catch (IllegalArgumentException e) {
                 throw new ParamException(e.getMessage() + e.getCause().getMessage());
             }
@@ -1435,7 +1435,7 @@ public class ParamUtils {
             case String:
                 return value.getStringData();
             case JSON:
-                return new Gson().fromJson(value.getStringData(), JsonObject.class);
+                return JsonUtils.fromJson(value.getStringData(), JsonObject.class);
             default:
                 break;
         }

+ 3 - 3
src/main/java/io/milvus/param/dml/ranker/WeightedRanker.java

@@ -19,8 +19,8 @@
 
 package io.milvus.param.dml.ranker;
 
-import com.google.gson.*;
-import com.google.gson.reflect.TypeToken;
+import com.google.gson.JsonObject;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.exception.ParamException;
 
 import lombok.Getter;
@@ -45,7 +45,7 @@ public class WeightedRanker extends BaseRanker {
     @Override
     public Map<String, String> getProperties() {
         JsonObject params = new JsonObject();
-        params.add("weights", new Gson().toJsonTree(this.weights).getAsJsonArray());
+        params.add("weights", JsonUtils.toJsonTree(this.weights).getAsJsonArray());
 
         Map<String, String> props = new HashMap<>();
         props.put("strategy", "weighted");

+ 2 - 2
src/main/java/io/milvus/v2/service/vector/request/ranker/WeightedRanker.java

@@ -19,8 +19,8 @@
 
 package io.milvus.v2.service.vector.request.ranker;
 
-import com.google.gson.Gson;
 import com.google.gson.JsonObject;
+import io.milvus.common.utils.JsonUtils;
 
 import java.util.HashMap;
 import java.util.List;
@@ -40,7 +40,7 @@ public class WeightedRanker extends BaseRanker {
     @Override
     public Map<String, String> getProperties() {
         JsonObject params = new JsonObject();
-        params.add("weights", new Gson().toJsonTree(this.weights).getAsJsonArray());
+        params.add("weights", JsonUtils.toJsonTree(this.weights).getAsJsonArray());
 
         Map<String, String> props = new HashMap<>();
         props.put("strategy", "weighted");

+ 2 - 2
src/main/java/io/milvus/v2/utils/ConvertUtils.java

@@ -19,8 +19,8 @@
 
 package io.milvus.v2.utils;
 
-import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.grpc.*;
 import io.milvus.param.Constant;
 import io.milvus.param.ParamUtils;
@@ -99,7 +99,7 @@ public class ConvertUtils {
                 } else if (param.getKey().equals(Constant.MMAP_ENABLED)) {
                     properties.put(param.getKey(), param.getValue());
                 } else if (param.getKey().equals(Constant.PARAMS)) {
-                    extraParams = new Gson().fromJson(param.getValue(), new TypeToken<Map<String, String>>() {}.getType());
+                    extraParams = JsonUtils.fromJson(param.getValue(), new TypeToken<Map<String, String>>() {}.getType());
                 }
             }
 

+ 2 - 4
src/main/java/io/milvus/v2/utils/VectorUtils.java

@@ -19,13 +19,12 @@
 
 package io.milvus.v2.utils;
 
-import com.google.gson.Gson;
 import com.google.protobuf.ByteString;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.v2.common.ConsistencyLevel;
 import io.milvus.exception.ParamException;
 import io.milvus.grpc.*;
 import io.milvus.param.Constant;
-import io.milvus.param.MetricType;
 import io.milvus.param.ParamUtils;
 import io.milvus.v2.service.vector.request.*;
 import io.milvus.v2.service.vector.request.ranker.BaseRanker;
@@ -37,7 +36,6 @@ import org.apache.commons.lang3.StringUtils;
 import java.util.*;
 
 public class VectorUtils {
-    private static final Gson GSON_INSTANCE = new Gson();
 
     public QueryRequest ConvertToGrpcQueryRequest(QueryReq request){
         QueryRequest.Builder builder = QueryRequest.newBuilder()
@@ -155,7 +153,7 @@ public class VectorUtils {
 
         if (null != request.getSearchParams()) {
             try {
-                String searchParams = GSON_INSTANCE.toJson(request.getSearchParams());
+                String searchParams = JsonUtils.toJson(request.getSearchParams());
                 builder.addSearchParams(
                         KeyValuePair.newBuilder()
                                 .setKey(Constant.PARAMS)

+ 29 - 32
src/test/java/io/milvus/client/MilvusClientDockerTest.java

@@ -28,6 +28,7 @@ import io.milvus.bulkwriter.common.clientenum.BulkFileType;
 import io.milvus.bulkwriter.common.utils.ParquetReaderUtils;
 import io.milvus.common.clientenum.ConsistencyLevelEnum;
 import io.milvus.common.utils.Float16Utils;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.exception.ParamException;
 import io.milvus.grpc.*;
 import io.milvus.orm.iterator.QueryIterator;
@@ -79,8 +80,6 @@ class MilvusClientDockerTest {
     protected static final float FLOAT16_PRECISION = 0.001f;
     protected static final float BFLOAT16_PRECISION = 0.01f;
 
-    protected static final Gson GSON_INSTANCE = new Gson();
-
     private static final Random RANDOM = new Random();
 
     @Container
@@ -477,22 +476,22 @@ class MilvusClientDockerTest {
                         row.add(fieldType.getName(), info);
                         break;
                     case Array:
-                        row.add(fieldType.getName(), GSON_INSTANCE.toJsonTree(generateRandomArray(fieldType)));
+                        row.add(fieldType.getName(), JsonUtils.toJsonTree(generateRandomArray(fieldType)));
                         break;
                     case FloatVector:
-                        row.add(fieldType.getName(), GSON_INSTANCE.toJsonTree(generateFloatVector()));
+                        row.add(fieldType.getName(), JsonUtils.toJsonTree(generateFloatVector()));
                         break;
                     case BinaryVector:
-                        row.add(fieldType.getName(), GSON_INSTANCE.toJsonTree(generateBinaryVector().array()));
+                        row.add(fieldType.getName(), JsonUtils.toJsonTree(generateBinaryVector().array()));
                         break;
                     case Float16Vector:
-                        row.add(fieldType.getName(), GSON_INSTANCE.toJsonTree(generateFloat16Vector().array()));
+                        row.add(fieldType.getName(), JsonUtils.toJsonTree(generateFloat16Vector().array()));
                         break;
                     case BFloat16Vector:
-                        row.add(fieldType.getName(), GSON_INSTANCE.toJsonTree(generateBFloat16Vector().array()));
+                        row.add(fieldType.getName(), JsonUtils.toJsonTree(generateBFloat16Vector().array()));
                         break;
                     case SparseFloatVector:
-                        row.add(fieldType.getName(), GSON_INSTANCE.toJsonTree(generateSparseVector()));
+                        row.add(fieldType.getName(), JsonUtils.toJsonTree(generateSparseVector()));
                         break;
                     default:
                         Assertions.fail();
@@ -1270,9 +1269,9 @@ class MilvusClientDockerTest {
 
             List<Float> vector = vectors.get(i + 5000);
             ByteBuffer fp16Vector = Float16Utils.f32VectorToFp16Buffer(vector);
-            row.add(DataType.Float16Vector.name(), GSON_INSTANCE.toJsonTree(fp16Vector.array()));
+            row.add(DataType.Float16Vector.name(), JsonUtils.toJsonTree(fp16Vector.array()));
             ByteBuffer bf16Vector = Float16Utils.f32VectorToBf16Buffer(vector);
-            row.add(DataType.BFloat16Vector.name(), GSON_INSTANCE.toJsonTree(bf16Vector.array()));
+            row.add(DataType.BFloat16Vector.name(), JsonUtils.toJsonTree(bf16Vector.array()));
             rows.add(row);
         }
 
@@ -2244,7 +2243,7 @@ class MilvusClientDockerTest {
             JsonObject row = new JsonObject();
             row.addProperty("id", 10000L + (long)i);
             List<Float> vector = generateFloatVectors(1).get(0);
-            row.add(DataType.FloatVector.name(), GSON_INSTANCE.toJsonTree(vector));
+            row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(vector));
 
             List<String> strArray = new ArrayList<>();
             List<Integer> intArray = new ArrayList<>();
@@ -2254,9 +2253,9 @@ class MilvusClientDockerTest {
                 intArray.add(i*10000 + k);
                 floatArray.add((float)k/1000 + i);
             }
-            row.add(varcharArrayName, GSON_INSTANCE.toJsonTree(strArray));
-            row.add(intArrayName, GSON_INSTANCE.toJsonTree(intArray));
-            row.add(floatArrayName, GSON_INSTANCE.toJsonTree(floatArray));
+            row.add(varcharArrayName, JsonUtils.toJsonTree(strArray));
+            row.add(intArrayName, JsonUtils.toJsonTree(intArray));
+            row.add(floatArrayName, JsonUtils.toJsonTree(floatArray));
 
             rows.add(row);
         }
@@ -2358,7 +2357,7 @@ class MilvusClientDockerTest {
             JsonObject row = new JsonObject();
             row.addProperty("id", i);
             List<Float> vector = generateFloatVectors(1).get(0);
-            row.add(DataType.FloatVector.name(), GSON_INSTANCE.toJsonTree(vector));
+            row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(vector));
             row.addProperty(DataType.VarChar.name(), String.format("name_%d", i));
             row.addProperty("dynamic_value", String.format("dynamic_%d", i));
             rows.add(row);
@@ -2432,7 +2431,7 @@ class MilvusClientDockerTest {
             JsonObject row = new JsonObject();
             row.addProperty("id", rowCount + i);
             List<Float> vector = generateFloatVectors(1).get(0);
-            row.add(DataType.FloatVector.name(), GSON_INSTANCE.toJsonTree(vector));
+            row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(vector));
             row.addProperty(DataType.VarChar.name(), String.format("name_%d", rowCount + i));
             rows.add(row);
         }
@@ -2475,14 +2474,14 @@ class MilvusClientDockerTest {
         JsonObject row = new JsonObject();
         row.addProperty("id", 5L);
         List<Float> vector = generateFloatVectors(1).get(0);
-        row.add(DataType.FloatVector.name(), GSON_INSTANCE.toJsonTree(vector));
+        row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(vector));
         row.addProperty(DataType.VarChar.name(), "updated_5");
         row.addProperty("dynamic_value", String.format("dynamic_%d", 5));
         rows.add(row);
         row = new JsonObject();
         row.addProperty("id", 18L);
         vector = generateFloatVectors(1).get(0);
-        row.add(DataType.FloatVector.name(), GSON_INSTANCE.toJsonTree(vector));
+        row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(vector));
         row.addProperty(DataType.VarChar.name(), "updated_18");
         row.addProperty("dynamic_value", 18);
         rows.add(row);
@@ -2670,7 +2669,7 @@ class MilvusClientDockerTest {
                 row.addProperty(primaryField.getName(), String.valueOf(i));
             }
             List<Float> vector = generateFloatVectors(1).get(0);
-            row.add(vectorField.getName(), GSON_INSTANCE.toJsonTree(vector));
+            row.add(vectorField.getName(), JsonUtils.toJsonTree(vector));
             rows.add(row);
             primaryIds.add(String.valueOf(i));
         }
@@ -2735,7 +2734,7 @@ class MilvusClientDockerTest {
                 row.addProperty(primaryField.getName(), String.valueOf(i));
             }
             List<Float> vector = generateFloatVectors(1).get(0);
-            row.add(vectorField.getName(), GSON_INSTANCE.toJsonTree(vector));
+            row.add(vectorField.getName(), JsonUtils.toJsonTree(vector));
             rows.add(row);
             primaryIds.add(String.valueOf(i));
         }
@@ -2822,13 +2821,13 @@ class MilvusClientDockerTest {
                 JsonObject obj = new JsonObject();
                 obj.addProperty("dummy", i);
                 row.add(DataType.JSON.name(), obj);
-                row.add(DataType.Array.name() + "_varchar", GSON_INSTANCE.toJsonTree(Lists.newArrayList("aaa", "bbb", "ccc")));
-                row.add(DataType.Array.name() + "_int32", GSON_INSTANCE.toJsonTree(Lists.newArrayList(5, 6, 3, 2, 1)));
-                row.add(DataType.Array.name() + "_float", GSON_INSTANCE.toJsonTree(Lists.newArrayList(0.5, 1.8)));
-                row.add(DataType.FloatVector.name(), GSON_INSTANCE.toJsonTree(generateFloatVector()));
-                row.add(DataType.BinaryVector.name(), GSON_INSTANCE.toJsonTree(generateBinaryVector().array()));
-                row.add(DataType.BFloat16Vector.name(), GSON_INSTANCE.toJsonTree(generateBFloat16Vector().array()));
-                row.add(DataType.SparseFloatVector.name(), GSON_INSTANCE.toJsonTree(generateSparseVector()));
+                row.add(DataType.Array.name() + "_varchar", JsonUtils.toJsonTree(Lists.newArrayList("aaa", "bbb", "ccc")));
+                row.add(DataType.Array.name() + "_int32", JsonUtils.toJsonTree(Lists.newArrayList(5, 6, 3, 2, 1)));
+                row.add(DataType.Array.name() + "_float", JsonUtils.toJsonTree(Lists.newArrayList(0.5, 1.8)));
+                row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(generateFloatVector()));
+                row.add(DataType.BinaryVector.name(), JsonUtils.toJsonTree(generateBinaryVector().array()));
+                row.add(DataType.BFloat16Vector.name(), JsonUtils.toJsonTree(generateBFloat16Vector().array()));
+                row.add(DataType.SparseFloatVector.name(), JsonUtils.toJsonTree(generateSparseVector()));
 
                 if (enabledDynamic) {
                     row.addProperty("dynamic_1", i);
@@ -2885,11 +2884,10 @@ class MilvusClientDockerTest {
         // insert data
         int rowCount = 1000;
         List<JsonObject> rows = new ArrayList<>();
-        Gson gson = new Gson();
         for (long i = 0L; i < rowCount; ++i) {
             JsonObject row = new JsonObject();
             row.addProperty("id", Long.toString(i));
-            row.add(DataType.FloatVector.name(), gson.toJsonTree(generateFloatVectors(1).get(0)));
+            row.add(DataType.FloatVector.name(), JsonUtils.toJsonTree(generateFloatVectors(1).get(0)));
             JsonObject json = new JsonObject();
             if (i%2 == 0) {
                 json.addProperty("even", true);
@@ -3061,7 +3059,7 @@ class MilvusClientDockerTest {
 
         // insert
         JsonObject row = new JsonObject();
-        row.add("vector", GSON_INSTANCE.toJsonTree(generateFloatVectors(1).get(0)));
+        row.add("vector", JsonUtils.toJsonTree(generateFloatVectors(1).get(0)));
         R<MutationResult> insertR = client.insert(InsertParam.newBuilder()
                 .withCollectionName(randomCollectionName)
                 .withRows(Collections.singletonList(row))
@@ -3194,12 +3192,11 @@ class MilvusClientDockerTest {
 
         // insert by row-based
         List<JsonObject> data = new ArrayList<>();
-        Gson gson = new Gson();
         for (int i = 0; i < 10; i++) {
             JsonObject row = new JsonObject();
             List<Float> vector = generateFloatVector();
             row.addProperty("id", i);
-            row.add("vector", gson.toJsonTree(vector));
+            row.add("vector", JsonUtils.toJsonTree(vector));
             if (i%2 == 0) {
                 row.addProperty("flag", i);
                 row.add("desc", JsonNull.INSTANCE);

+ 30 - 35
src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java

@@ -24,6 +24,7 @@ import com.google.gson.*;
 
 import com.google.gson.reflect.TypeToken;
 import io.milvus.common.utils.Float16Utils;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.orm.iterator.QueryIterator;
 import io.milvus.orm.iterator.SearchIterator;
 import io.milvus.param.Constant;
@@ -75,8 +76,6 @@ class MilvusClientV2DockerTest {
     private static RandomStringGenerator generator;
     private static final int dimension = 256;
 
-    private static final Gson GSON_INSTANCE = new Gson();
-
     private static final Random RANDOM = new Random();
 
     @Container
@@ -244,7 +243,7 @@ class MilvusClientV2DockerTest {
                 for (int i = 0; i < eleCnt; i++) {
                     values.add(i%10 == 0);
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             case Int8:
             case Int16: {
@@ -252,42 +251,42 @@ class MilvusClientV2DockerTest {
                 for (int i = 0; i < eleCnt; i++) {
                     values.add((short)RANDOM.nextInt(256));
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             case Int32: {
                 List<Integer> values = new ArrayList<>();
                 for (int i = 0; i < eleCnt; i++) {
                     values.add(RANDOM.nextInt());
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             case Int64: {
                 List<Long> values = new ArrayList<>();
                 for (int i = 0; i < eleCnt; i++) {
                     values.add(RANDOM.nextLong());
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             case Float: {
                 List<Float> values = new ArrayList<>();
                 for (int i = 0; i < eleCnt; i++) {
                     values.add(RANDOM.nextFloat());
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             case Double: {
                 List<Double> values = new ArrayList<>();
                 for (int i = 0; i < eleCnt; i++) {
                     values.add(RANDOM.nextDouble());
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             case VarChar: {
                 List<String> values = new ArrayList<>();
                 for (int i = 0; i < eleCnt; i++) {
                     values.add(String.format("varchar_arr_%d", i));
                 }
-                return GSON_INSTANCE.toJsonTree(values).getAsJsonArray();
+                return JsonUtils.toJsonTree(values).getAsJsonArray();
             }
             default:
                 Assertions.fail();
@@ -330,7 +329,7 @@ class MilvusClientV2DockerTest {
                     case JSON: {
                         JsonObject jsonObj = new JsonObject();
                         jsonObj.addProperty(String.format("JSON_%d", i), i);
-                        jsonObj.add("flags", GSON_INSTANCE.toJsonTree(new long[]{i, i+1, i + 2}));
+                        jsonObj.add("flags", JsonUtils.toJsonTree(new long[]{i, i+1, i + 2}));
                         row.add(field.getName(), jsonObj);
                         break;
                     }
@@ -341,27 +340,27 @@ class MilvusClientV2DockerTest {
                     }
                     case FloatVector: {
                         List<Float> vector = generateFolatVector();
-                        row.add(field.getName(), GSON_INSTANCE.toJsonTree(vector));
+                        row.add(field.getName(), JsonUtils.toJsonTree(vector));
                         break;
                     }
                     case BinaryVector: {
                         ByteBuffer vector = generateBinaryVector();
-                        row.add(field.getName(), GSON_INSTANCE.toJsonTree(vector.array()));
+                        row.add(field.getName(), JsonUtils.toJsonTree(vector.array()));
                         break;
                     }
                     case Float16Vector: {
                         ByteBuffer vector = generateFloat16Vector();
-                        row.add(field.getName(), GSON_INSTANCE.toJsonTree(vector.array()));
+                        row.add(field.getName(), JsonUtils.toJsonTree(vector.array()));
                         break;
                     }
                     case BFloat16Vector: {
                         ByteBuffer vector = generateBFloat16Vector();
-                        row.add(field.getName(), GSON_INSTANCE.toJsonTree(vector.array()));
+                        row.add(field.getName(), JsonUtils.toJsonTree(vector.array()));
                         break;
                     }
                     case SparseFloatVector: {
                         SortedMap<Long, Float> vector = generateSparseVector();
-                        row.add(field.getName(), GSON_INSTANCE.toJsonTree(vector));
+                        row.add(field.getName(), JsonUtils.toJsonTree(vector));
                         break;
                     }
                     default:
@@ -395,13 +394,13 @@ class MilvusClientV2DockerTest {
         Assertions.assertEquals(row.get("json_field").toString(), jsn.toString());
 
         List<Integer> arrInt = (List<Integer>) entity.get("arr_int_field");
-        List<Integer> arrIntOri = GSON_INSTANCE.fromJson(row.get("arr_int_field"), new TypeToken<List<Integer>>() {}.getType());
+        List<Integer> arrIntOri = JsonUtils.fromJson(row.get("arr_int_field"), new TypeToken<List<Integer>>() {}.getType());
         Assertions.assertEquals(arrIntOri, arrInt);
         List<Float> arrFloat = (List<Float>) entity.get("arr_float_field");
-        List<Float> arrFloatOri = GSON_INSTANCE.fromJson(row.get("arr_float_field"), new TypeToken<List<Float>>() {}.getType());
+        List<Float> arrFloatOri = JsonUtils.fromJson(row.get("arr_float_field"), new TypeToken<List<Float>>() {}.getType());
         Assertions.assertEquals(arrFloatOri, arrFloat);
         List<String> arrStr = (List<String>) entity.get("arr_varchar_field");
-        List<String> arrStrOri = GSON_INSTANCE.fromJson(row.get("arr_varchar_field"), new TypeToken<List<String>>() {}.getType());
+        List<String> arrStrOri = JsonUtils.fromJson(row.get("arr_varchar_field"), new TypeToken<List<String>>() {}.getType());
         Assertions.assertEquals(arrStrOri, arrStr);
     }
 
@@ -531,7 +530,7 @@ class MilvusClientV2DockerTest {
         for (int i = 0; i < nq; i++) {
             JsonObject row = data.get(RANDOM.nextInt((int)count));
             targetIDs.add(row.get("id").getAsLong());
-            List<Float> vector = GSON_INSTANCE.fromJson(row.get(vectorFieldName), new TypeToken<List<Float>>() {}.getType());
+            List<Float> vector = JsonUtils.fromJson(row.get(vectorFieldName), new TypeToken<List<Float>>() {}.getType());
             targetVectors.add(new FloatVec(vector));
         }
 
@@ -638,7 +637,7 @@ class MilvusClientV2DockerTest {
         for (int i = 0; i < nq; i++) {
             JsonObject row = data.get(RANDOM.nextInt((int)count));
             targetIDs.add(row.get("id").getAsLong());
-            byte[] vector = GSON_INSTANCE.fromJson(row.get(vectorFieldName), new TypeToken<byte[]>() {}.getType());
+            byte[] vector = JsonUtils.fromJson(row.get(vectorFieldName), new TypeToken<byte[]>() {}.getType());
             targetVectors.add(new BinaryVec(vector));
         }
         SearchResp searchResp = client.search(SearchReq.builder()
@@ -727,8 +726,8 @@ class MilvusClientV2DockerTest {
             originVector.add((float)1/(i+1));
         }
         System.out.println("Original float32 vector: " + originVector);
-        row.add(float16Field, GSON_INSTANCE.toJsonTree(Float16Utils.f32VectorToFp16Buffer(originVector).array()));
-        row.add(bfloat16Field, GSON_INSTANCE.toJsonTree(Float16Utils.f32VectorToBf16Buffer(originVector).array()));
+        row.add(float16Field, JsonUtils.toJsonTree(Float16Utils.f32VectorToFp16Buffer(originVector).array()));
+        row.add(bfloat16Field, JsonUtils.toJsonTree(Float16Utils.f32VectorToBf16Buffer(originVector).array()));
 
         UpsertResp upsertResp = client.upsert(UpsertReq.builder()
                 .collectionName(randomCollectionName)
@@ -845,7 +844,7 @@ class MilvusClientV2DockerTest {
         for (int i = 0; i < nq; i++) {
             JsonObject row = data.get(RANDOM.nextInt((int)count));
             targetIDs.add(row.get("id").getAsLong());
-            SortedMap<Long, Float> vector = GSON_INSTANCE.fromJson(row.get(vectorFieldName), new TypeToken<SortedMap<Long, Float>>() {}.getType());
+            SortedMap<Long, Float> vector = JsonUtils.fromJson(row.get(vectorFieldName), new TypeToken<SortedMap<Long, Float>>() {}.getType());
             targetVectors.add(new SparseFloatVec(vector));
         }
         SearchResp searchResp = client.search(SearchReq.builder()
@@ -1011,11 +1010,10 @@ class MilvusClientV2DockerTest {
 
         // insert
         List<JsonObject> data = new ArrayList<>();
-        Gson gson = new Gson();
         for (int i = 0; i < 10; i++) {
             JsonObject row = new JsonObject();
             row.addProperty("pk", String.format("pk_%d", i));
-            row.add("float_vector", gson.toJsonTree(new float[]{(float)i, (float)(i + 1), (float)(i + 2), (float)(i + 3)}));
+            row.add("float_vector", JsonUtils.toJsonTree(new float[]{(float)i, (float)(i + 1), (float)(i + 2), (float)(i + 3)}));
             data.add(row);
         }
 
@@ -1040,11 +1038,11 @@ class MilvusClientV2DockerTest {
         List<JsonObject> dataUpdate = new ArrayList<>();
         JsonObject row1 = new JsonObject();
         row1.addProperty("pk", "pk_5");
-        row1.add("float_vector", gson.toJsonTree(new float[]{5.0f, 5.0f, 5.0f, 5.0f}));
+        row1.add("float_vector", JsonUtils.toJsonTree(new float[]{5.0f, 5.0f, 5.0f, 5.0f}));
         dataUpdate.add(row1);
         JsonObject row2 = new JsonObject();
         row2.addProperty("pk", "pk_2");
-        row2.add("float_vector", gson.toJsonTree(new float[]{2.0f, 2.0f, 2.0f, 2.0f}));
+        row2.add("float_vector", JsonUtils.toJsonTree(new float[]{2.0f, 2.0f, 2.0f, 2.0f}));
         dataUpdate.add(row2);
         UpsertResp upsertResp = client.upsert(UpsertReq.builder()
                 .collectionName(randomCollectionName)
@@ -1330,7 +1328,7 @@ class MilvusClientV2DockerTest {
 
         // insert
         JsonObject row = new JsonObject();
-        row.add("vector", GSON_INSTANCE.toJsonTree(generateFloatVectors(1).get(0)));
+        row.add("vector", JsonUtils.toJsonTree(generateFloatVectors(1).get(0)));
         InsertResp insertResp = client.insert(InsertReq.builder()
                 .collectionName(randomCollectionName)
                 .data(Collections.singletonList(row))
@@ -1360,7 +1358,7 @@ class MilvusClientV2DockerTest {
         for (int i = 0; i < 100; ++i) {
             vector.add(RANDOM.nextFloat());
         }
-        row.add("vector", GSON_INSTANCE.toJsonTree(vector));
+        row.add("vector", JsonUtils.toJsonTree(vector));
         insertResp = client.insert(InsertReq.builder()
                 .collectionName(randomCollectionName)
                 .data(Collections.singletonList(row))
@@ -1752,7 +1750,6 @@ class MilvusClientV2DockerTest {
         System.out.println("Collection created");
 
         try {
-            Gson gson = new Gson();
             Random rand = new Random();
             List<Thread> threadList = new ArrayList<>();
             for (int k = 0; k < 10; k++) {
@@ -1764,7 +1761,7 @@ class MilvusClientV2DockerTest {
                             JsonObject obj = new JsonObject();
                             obj.addProperty("id", String.format("%d", i*cnt + j));
                             List<Float> vector = generateFolatVector(dim);
-                            obj.add("vector", gson.toJsonTree(vector));
+                            obj.add("vector", JsonUtils.toJsonTree(vector));
                             obj.addProperty("dataTime", System.currentTimeMillis());
                             rows.add(obj);
                         }
@@ -1797,7 +1794,6 @@ class MilvusClientV2DockerTest {
         }
 
         try {
-            Gson gson = new Gson();
             Random rand = new Random();
             List<Thread> threadList = new ArrayList<>();
             for (int k = 0; k < 10; k++) {
@@ -1809,7 +1805,7 @@ class MilvusClientV2DockerTest {
                             JsonObject obj = new JsonObject();
                             obj.addProperty("id", String.format("%d", i*cnt + j));
                             List<Float> vector = generateFolatVector(dim);
-                            obj.add("vector", gson.toJsonTree(vector));
+                            obj.add("vector", JsonUtils.toJsonTree(vector));
                             obj.addProperty("dataTime", System.currentTimeMillis());
                             rows.add(obj);
                         }
@@ -1889,12 +1885,11 @@ class MilvusClientV2DockerTest {
 
         // insert by row-based
         List<JsonObject> data = new ArrayList<>();
-        Gson gson = new Gson();
         for (int i = 0; i < 10; i++) {
             JsonObject row = new JsonObject();
             List<Float> vector = generateFolatVector(dim);
             row.addProperty("id", i);
-            row.add("vector", gson.toJsonTree(vector));
+            row.add("vector", JsonUtils.toJsonTree(vector));
             if (i%2 == 0) {
                 row.addProperty("flag", i);
                 row.add("desc", JsonNull.INSTANCE);

+ 3 - 3
src/test/java/io/milvus/v2/service/vector/VectorTest.java

@@ -20,6 +20,7 @@
 package io.milvus.v2.service.vector;
 
 import com.google.gson.*;
+import io.milvus.common.utils.JsonUtils;
 import io.milvus.v2.BaseTest;
 import io.milvus.v2.service.vector.request.*;
 import io.milvus.v2.service.vector.request.data.FloatVec;
@@ -40,13 +41,12 @@ class VectorTest extends BaseTest {
     void testInsert() {
 
         List<JsonObject> data = new ArrayList<>();
-        Gson gson = new Gson();
         for (int i = 0; i < 100; i++) {
             JsonObject vector = new JsonObject();
             List<Float> vectorList = new ArrayList<>();
             vectorList.add(1.0f);
             vectorList.add(2.0f);
-            vector.add("vector", gson.toJsonTree(vectorList));
+            vector.add("vector", JsonUtils.toJsonTree(vectorList));
             vector.addProperty("id", (long) i);
             data.add(vector);
         }
@@ -66,7 +66,7 @@ class VectorTest extends BaseTest {
         List<Float> vectorList = new ArrayList<>();
         vectorList.add(2.0f);
         vectorList.add(3.0f);
-        jsonObject.add("vector", new Gson().toJsonTree(vectorList));
+        jsonObject.add("vector", JsonUtils.toJsonTree(vectorList));
         jsonObject.addProperty("id", 0L);
         UpsertReq request = UpsertReq.builder()
                 .collectionName("test")