0

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

但是,类型推断必须手动完成。例如,像我在下面尝试做的事情?使用Boolean.parseBooleanetc 对我来说感觉很臃肿,因为杰克逊把所有这些东西都做得很好......

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 行解析为具有正确值类型的 JsonNodes 而无需依赖 POJO 来提供它们?

4

1 回答 1

2

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

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

答案是肯定的。例如:

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

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

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


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


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

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

于 2018-09-18T12:24:55.743 回答