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 1abc513b23..473429d526 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 @@ -229,7 +229,7 @@ public class JsonConverter { String valueAsString = value.getAsString(); KeyValueProto.Builder builder = KeyValueProto.newBuilder().setKey(key); var bd = new BigDecimal(valueAsString); - if (bd.stripTrailingZeros().scale() <= 0) { + if (bd.stripTrailingZeros().scale() <= 0 && !isSimpleDouble(valueAsString)) { try { return builder.setType(KeyValueType.LONG_V).setLongV(bd.longValueExact()).build(); } catch (ArithmeticException e) { @@ -251,6 +251,10 @@ public class JsonConverter { } + private static boolean isSimpleDouble(String valueAsString) { + return valueAsString.contains(".") && !valueAsString.contains("E") && !valueAsString.contains("e"); + } + 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(); @@ -260,7 +264,7 @@ public class JsonConverter { String valueAsString = value.getAsString(); String key = valueEntry.getKey(); var bd = new BigDecimal(valueAsString); - if (bd.stripTrailingZeros().scale() <= 0) { + if (bd.stripTrailingZeros().scale() <= 0 && !isSimpleDouble(valueAsString)) { try { result.add(new LongDataEntry(key, bd.longValueExact())); } catch (ArithmeticException e) { diff --git a/common/transport/transport-api/src/test/java/JsonConverterTest.java b/common/transport/transport-api/src/test/java/JsonConverterTest.java index 5aa5c28c0e..2c1a3c5551 100644 --- a/common/transport/transport-api/src/test/java/JsonConverterTest.java +++ b/common/transport/transport-api/src/test/java/JsonConverterTest.java @@ -53,6 +53,12 @@ public class JsonConverterTest { Assert.assertEquals(10L, result.get(0).getLongValue().get().longValue()); } + @Test + public void testParseAsDoubleWithZero() { + var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 42.0}"), 0L); + Assert.assertEquals(42.0, result.get(0L).get(0).getDoubleValue().get(), 0.0); + } + @Test public void testParseAsDouble() { var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L);