很容易将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总是错误的。 有时,出于实用原因,在特定情况下忽略设计原则是合适的。 但是,这种设计不是通用的。