thingsboard-aplcache

Details

diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java
index 7498e8e..b497fe0 100644
--- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java
+++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java
@@ -22,6 +22,7 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSyntaxException;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.util.StringUtils;
 import org.thingsboard.server.common.data.kv.AttributeKey;
 import org.thingsboard.server.common.data.kv.AttributeKvEntry;
@@ -128,24 +129,22 @@ public class JsonConverter {
             if (element.isJsonPrimitive()) {
                 JsonPrimitive value = element.getAsJsonPrimitive();
                 if (value.isString()) {
-                    result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.STRING_V)
-                            .setStringV(value.getAsString()).build());
+                    if(NumberUtils.isParsable(value.getAsString())) {
+                        try {
+                            result.add(buildNumericKeyValueProto(value, valueEntry.getKey()));
+                        } catch (Throwable th) {
+                            result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.STRING_V)
+                                    .setStringV(value.getAsString()).build());
+                        }
+                    } else {
+                        result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.STRING_V)
+                                .setStringV(value.getAsString()).build());
+                    }
                 } else if (value.isBoolean()) {
                     result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.BOOLEAN_V)
                             .setBoolV(value.getAsBoolean()).build());
                 } else if (value.isNumber()) {
-                    if (value.getAsString().contains(".")) {
-                        result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.DOUBLE_V)
-                                .setDoubleV(value.getAsDouble()).build());
-                    } else {
-                        try {
-                            long longValue = Long.parseLong(value.getAsString());
-                            result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.LONG_V)
-                                    .setLongV(longValue).build());
-                        } catch (NumberFormatException e) {
-                            throw new JsonSyntaxException("Big integer values are not supported!");
-                        }
-                    }
+                    result.add(buildNumericKeyValueProto(value, valueEntry.getKey()));
                 } else {
                     throw new JsonSyntaxException(CAN_T_PARSE_VALUE + value);
                 }
@@ -156,6 +155,24 @@ public class JsonConverter {
         return result;
     }
 
+    private static KeyValueProto buildNumericKeyValueProto(JsonPrimitive value, String key) {
+        if (value.getAsString().contains(".")) {
+            return KeyValueProto.newBuilder()
+                    .setKey(key)
+                    .setType(KeyValueType.DOUBLE_V)
+                    .setDoubleV(value.getAsDouble())
+                    .build();
+        } else {
+            try {
+                long longValue = Long.parseLong(value.getAsString());
+                return KeyValueProto.newBuilder().setKey(key).setType(KeyValueType.LONG_V)
+                        .setLongV(longValue).build();
+            } catch (NumberFormatException e) {
+                throw new JsonSyntaxException("Big integer values are not supported!");
+            }
+        }
+    }
+
     public static TransportProtos.ToServerRpcRequestMsg convertToServerRpcRequest(JsonElement json, int requestId) throws JsonSyntaxException {
         JsonObject object = json.getAsJsonObject();
         return TransportProtos.ToServerRpcRequestMsg.newBuilder().setRequestId(requestId).setMethodName(object.get("method").getAsString()).setParams(GSON.toJson(object.get("params"))).build();
@@ -370,7 +387,15 @@ public class JsonConverter {
             if (element.isJsonPrimitive()) {
                 JsonPrimitive value = element.getAsJsonPrimitive();
                 if (value.isString()) {
-                    result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString()));
+                    if(NumberUtils.isParsable(value.getAsString())) {
+                        try {
+                            parseNumericValue(result, valueEntry, value);
+                        } catch (Throwable th) {
+                            result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString()));
+                        }
+                    } else {
+                        result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString()));
+                    }
                 } else if (value.isBoolean()) {
                     result.add(new BooleanDataEntry(valueEntry.getKey(), value.getAsBoolean()));
                 } else if (value.isNumber()) {