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



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

但是,类型推断必须手动完成。 例如,喜欢我在下面尝试做的事情?使用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行解析为具有正确值类型的JsonNodes,而无需依赖POJO提供它们?

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

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

答案是肯定的。 例如:

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

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

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


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


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

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

相关内容

  • 没有找到相关文章

最新更新