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

标签 java csv jackson jackson-dataformat-csv

很容易将 csv 解析为 List<Map<String,String>>https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv#with-column-names-from-first-row 中所述

但是,类型推断必须手动完成。例如。喜欢我下面尝试做的事情吗?使用Boolean.parseBoolean对我来说,等等感觉就像是臃肿,因为 jackson 把所有这些事情都做得很好......

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

最佳答案

有两种方法可以阅读您的问题。

Is it theoretically possible to parse the CSV rows into JsonNodes having the correct value types .... ?

答案是肯定的。例如:

  • 您可以从头开始编写自己的 CSV 解析器,它会发出 JsonNode对象。
  • 您可以调用 List<Map<String,String>>从现有的 CSV 解析器中,应用一些启发式1 来转换为相应的 JsonNode结构(无论是什么)。

Is it possible to parse the CSV rows into JsonNodes having the correct value types ... using an existing parser?

答案几乎肯定是否定的。精心设计的2通用 CSV 解析器不会发出 JSON 数据结构,而精心设计的2通用 JSON解析器不接受 CSV 格式输入。

<小时/>

但是从字里行间看,我怀疑您正在使用JsonNode只是因为它是表示松散类型信息的便捷方式。但是字符串的工作方式也一样(作为纯表示),并且您可以使用简单的自定义实用程序或包装类来实现到(更多)类型化表示的转换。

<小时/>

1 - 这里存在一个问题。 CSV 本质上是无类型的,因此您需要使用启发式方法来判断某个值是 boolean 值、整数、 float 还是字符串。但转换不明确,并且 CSV 文件中的行可能不一致。所以你的转换为 JsonNode如果您没有 CSV 文件的“架构”,对象可能不可靠。

2 - 在这两种情况下,这都会违反 Separation of Concerns (SoC)设计原理。这并不意味着这样的 API总是是错误的。有时,出于务实的原因,在特定情况下忽略设计原则是适当的。然而,这样的设计并不通用。

关于java - 是否可以将 CSV 行解析为具有正确值类型的 JsonNodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52384169/

相关文章:

java - 使用 HttpURLConnection 设置相互身份验证客户端

python - 导入 CSV 文件时 Python 3 中的 UnicodeDecodeError

java - Jackson 生成意外的 "new"字段

java - 如何正确重用 Jackson ObjectMapper?

java - 如何使用 netbean 将印地语记录插入 mysql

java - 在较少重复的代码或高效但重复的代码之间进行选择

java - 如何像其他Windows应用程序一样运行java桌面应用程序?

linux - 如何从 TXT 或 CSV 中删除具有特定模式的行

python - 从文本文件中识别列表

java - 使用 Jackson 反序列化带有重复嵌套标签的 xml