java - 在 CSV 映射期间将 't'/'f' 解析为 boolean 值

标签 java android csv jackson deserialization

假设我有这样一个 CSV:

name,city,active
abc,bcde,t
xyz,ghj,f

如果我想将其映射到模型,我该如何将 't''f' 转换为正确的 boolean 值。我正在使用 jackson-dataformat-csv 映射来执行此操作

CsvSchema csvSchema = CsvSchema.emptySchema().withHeader().withNullValue("");
CsvMapper csvMapper = new CsvMapper();
csvMapper.setPropertyNamingStrategy(SNAKE_CASE);
csvMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MappingIterator<Article> iterator = csvMapper.readerWithTypedSchemaFor(Object.class).with(csvSchema).readValues(fileFromResponse);
List<Object> data = iterator.readAll();

目前映射失败并显示此错误消息:

Cannot deserialize value of type `java.lang.Boolean` from String "t": only "true" or "false" recognized

有什么方法可以在架构中指定“t”或“f”应被视为 boolean 值。还是有其他方法可以反序列化它?

最佳答案

您可以使用 boolean 类型的映射器注册自定义 JacksonModule:

private val YNToBooleanDeserializer = object : JsonDeserializer<Boolean>() {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Boolean {
        return p.readValueAs(String::class.java) == "t"
    }
}

注册,使用:

csvObjectMapper.registerModule(SimpleModule().addDeserializer(Boolean::class.java, YNToBooleanDeserializer))

关于java - 在 CSV 映射期间将 't'/'f' 解析为 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48023491/

相关文章:

java - 选择排序(Java)

Android - ListView 没有收到带有可点击链接的 TextView 的 OnItemClick

android - findViewById(R.id.tabhost) 始终返回 null

perl - 当只需要字段的子集时,分割长行的高性能方法是什么

Python 转 CSV : transposing and appending values to list of lists

java - 使用 JUNG 计算特征向量值

java - 使用 Groovy 脚本约束进行结构搜索和替换

java - 如何避免 swagger codegen 接口(interface)中的默认方法实现?

Android布局对齐问题

python - 如何比较对象列表中的匹配值?