是否可以将CSV行解析为具有正确值类型的JsonNodes

时间:2018-09-18 10:10:05

标签: java csv jackson jackson-dataformat-csv

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来提供它们?

1 个答案:

答案 0 :(得分:1)

阅读问题有两种方法。

  

从理论上来说是否可以将CSV行解析为具有正确值类型的JsonNodes ....?

答案是肯定的。例如:

  • 您可以从头开始编写自己的CSV解析器,该解析器会发出JsonNode个对象。
  • 您可以从现有的CSV解析器中获取List<Map<String,String>>,应用一些启发式方法 1 转换为相应的JsonNode结构(无论如何)。
  

是否可以使用现有解析器将CSV行解析为具有正确值类型的JsonNode?

几乎可以肯定,答案是肯定的。(自重)CSV解析器不会发出JSON数据结构,(自重)JSON解析器不会接受CSV格式输入。


但是在两行之间阅读时,我怀疑您在使用JsonNode只是因为它是表示松散类型信息的便捷方式。但是字符串的工作原理(与纯表示形式一样)也很好,并且您可以使用简单的自定义实用程序或包装器类来实现对(更多)类型化表示形式的转换。


1-这里存在一个问题。 CSV本质上是无类型的,因此您需要使用启发式方法来告诉您值是布尔值,整数,浮点数还是字符串。但是转换是不明确的,并且CSV文件中的行可能会不一致。因此,如果您没有CSV文件的“模式”,那么您对JsonNode对象的转换就很不可靠。