cast incoming attributes/telemetry numeric data type if possible
This commit is contained in:
		
							parent
							
								
									162029939b
								
							
						
					
					
						commit
						62db6001fd
					
				@ -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()) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user