Improvements to data converter
This commit is contained in:
		
							parent
							
								
									4ec25beeb3
								
							
						
					
					
						commit
						b59c846885
					
				@ -226,19 +226,29 @@ public class JsonConverter {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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();
 | 
			
		||||
        String valueAsString = value.getAsString();
 | 
			
		||||
        KeyValueProto.Builder builder = KeyValueProto.newBuilder().setKey(key);
 | 
			
		||||
        if (valueAsString.contains("e") || valueAsString.contains("E")) {
 | 
			
		||||
            //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
 | 
			
		||||
            var bd = new BigDecimal(valueAsString);
 | 
			
		||||
            if (bd.stripTrailingZeros().scale() <= 0) {
 | 
			
		||||
                try {
 | 
			
		||||
                    return builder.setType(KeyValueType.LONG_V).setLongV(bd.longValueExact()).build();
 | 
			
		||||
                } catch (ArithmeticException e) {
 | 
			
		||||
                    return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(bd.doubleValue()).build();
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(bd.doubleValue()).build();
 | 
			
		||||
            }
 | 
			
		||||
        } else if (valueAsString.contains(".")) {
 | 
			
		||||
            return builder.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();
 | 
			
		||||
                return builder.setType(KeyValueType.LONG_V).setLongV(longValue).build();
 | 
			
		||||
            } catch (NumberFormatException e) {
 | 
			
		||||
                throw new JsonSyntaxException("Big integer values are not supported!");
 | 
			
		||||
                //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
 | 
			
		||||
                return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(new BigDecimal(valueAsString).doubleValue()).build();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -252,6 +262,7 @@ public class JsonConverter {
 | 
			
		||||
        String valueAsString = value.getAsString();
 | 
			
		||||
        String key = valueEntry.getKey();
 | 
			
		||||
        if (valueAsString.contains("e") || valueAsString.contains("E")) {
 | 
			
		||||
            //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
 | 
			
		||||
            var bd = new BigDecimal(valueAsString);
 | 
			
		||||
            if (bd.stripTrailingZeros().scale() <= 0) {
 | 
			
		||||
                try {
 | 
			
		||||
@ -269,7 +280,8 @@ public class JsonConverter {
 | 
			
		||||
                long longValue = Long.parseLong(value.getAsString());
 | 
			
		||||
                result.add(new LongDataEntry(key, longValue));
 | 
			
		||||
            } catch (NumberFormatException e) {
 | 
			
		||||
                throw new JsonSyntaxException("Big integer values are not supported!");
 | 
			
		||||
                //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
 | 
			
		||||
                result.add(new DoubleDataEntry(key, new BigDecimal(valueAsString).doubleValue()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,8 @@ import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
import org.thingsboard.server.common.transport.adaptor.JsonConverter;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class JsonConverterTest {
 | 
			
		||||
 | 
			
		||||
@ -38,6 +40,12 @@ public class JsonConverterTest {
 | 
			
		||||
        Assert.assertEquals(10.1, result.get(0L).get(0).getDoubleValue().get(), 0.0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testParseAttributesBigDecimalAsLong() {
 | 
			
		||||
        var result = new ArrayList<>(JsonConverter.convertToAttributes(JSON_PARSER.parse("{\"meterReadingDelta\": 1E1}")));
 | 
			
		||||
        Assert.assertEquals(10L, result.get(0).getLongValue().get().longValue());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testParseAsDouble() {
 | 
			
		||||
        var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user