【问题标题】:How properly verify type when JSON have only string values当 JSON 只有字符串值时如何正确验证类型
【发布时间】:2019-07-24 08:22:22
【问题描述】:

我有一个类型的枚举:

enum class DataType {
    BOOLEAN,
    DOUBLE,
    STRING,
    TIMESTAMP
}

和数据类:

data class Entity(
    @Id
    val id: UUID,

    val name: String,
    val properties: List<Property>
)

data class Property(
    val name: String,
    val value: String
)

我有 EntityType 类,它为每个属性定义属性名称和类型:

data class EntityType(
    @Id
    val id: UUID,

    val name: String,
    val properties: List<PropertyDefinition>
)

data class PropertyDefinition(
    val name: String,
    val dataType: DataType
)

我想根据它的EntityType保存必备属性的每个实体。我想验证实体属性中的每个属性。接下来我做:

val entityPropertiesMap = entity.properties.map { Pair(it.name, it) }.toMap()

entityTypeProperties.forEach {
    try {
        when (it.dataType) {
            DataType.BOOLEAN -> checkBoolean(property.value)
            DataType.DOUBLE -> property.value.toDouble()
            DataType.TIMESTAMP -> Instant.parse(property.value)
            DataType.STRING -> if (!property.value.matches(Regex("[a-zA-Z0-9-_.]+"))) {
                throw WrongPropertyValuePatternException("Entity property value '${property.value}' does not match with the pattern [a-zA-Z0-9-_.]+")
            }
        }
    } catch (e: Exception) {
        when (e) {
             is NumberFormatException, is DateTimeParseException, is WrongBooleanFormatException ->
                  throw EntityPropertyCastException("Property '${property.name}' with value '${property.value}' can't be casted to ${it.dataType}.")
             is WrongPropertyValuePatternException -> throw e
             else -> throw e
        }
    }
}

如您所见,我正在尝试解析值,如果出现错误,我会捕获异常。我不会写

DataType.DOUBLE -> if (!(property.value is Double)) throw SomeMyException("...")

因为property.value 始终是字符串。如何在不捕获解析异常的情况下验证类型?还是像我一样做是正常的做法?

【问题讨论】:

    标签: json exception kotlin casting type-conversion


    【解决方案1】:

    因为它是一个字符串,这意味着您需要将其转换为 double / 或其他值。如果不处理可能的异常,就无法事先知道它。因此,回答您的问题时,使用 try/catch 是从字符串转换为数字时的常见做法。

    (另外,你不需要那行is WrongPropertyValuePatternException -&gt; throw e,因为以后你基本上还是throw e

    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/to-double.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多