如https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv#with-column-names-from-first-row所述,很容易将csv解析为List<Map<String,String>>
但是,类型推断必须手动完成。例如。喜欢我在下面尝试做的事情?对我来说,使用Boolean.parseBoolean
等感觉很膨胀,因为杰克逊将所有这些事情都做得很好...
CsvSchema schema = CsvSchema.emptySchema().withHeader();
CsvMapper mapper = new CsvMapper();
ObjectReader with = mapper.readerFor(ArrayNode.class).with(schema);
mapper.enable(CsvParser.Feature.WRAP_AS_ARRAY);
JsonNode readTree = with.readTree(new FileInputStream(file));
JsonNode jsonNode = arrayNode.get(0);
if (jsonNode.isObject()) {
Iterator<Entry<String, JsonNode>> fields = jsonNode.fields();
int counter = 0;
while (fields.hasNext()) {
Entry<String, JsonNode> entry = fields.next();
JsonNode value = entry.getValue();
if (value.isBoolean()) {
// nah
} else if (value.isNumber()) {
// yeah
} else if (value.isTextual()) {
// nah
}
}
}
是否可以将CSV行解析为具有正确值类型的JsonNode,而无需依赖POJO来提供它们?
答案 0 :(得分:1)
阅读问题有两种方法。
从理论上来说是否可以将CSV行解析为具有正确值类型的JsonNodes ....?
答案是肯定的。例如:
JsonNode
个对象。List<Map<String,String>>
,应用一些启发式方法 1 转换为相应的JsonNode
结构(无论如何)。是否可以使用现有解析器将CSV行解析为具有正确值类型的JsonNode? p>
几乎可以肯定,答案是肯定的。(自重)CSV解析器不会发出JSON数据结构,(自重)JSON解析器不会接受CSV格式输入。
但是在两行之间阅读时,我怀疑您在使用JsonNode
只是因为它是表示松散类型信息的便捷方式。但是字符串的工作原理(与纯表示形式一样)也很好,并且您可以使用简单的自定义实用程序或包装器类来实现对(更多)类型化表示形式的转换。
1-这里存在一个问题。 CSV本质上是无类型的,因此您需要使用启发式方法来告诉您值是布尔值,整数,浮点数还是字符串。但是转换是不明确的,并且CSV文件中的行可能会不一致。因此,如果您没有CSV文件的“模式”,那么您对JsonNode
对象的转换就很不可靠。