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

Java 是否可以将CSV行解析为具有正确值类型的JsonNodes,java,csv,jackson,jackson-dataformat-csv,Java,Csv,Jackson,Jackson Dataformat Csv,很容易将csv解析为列表,如中所述 然而,类型推断必须手动完成。例如,喜欢我在下面尝试做的事情?对我来说,使用Boolean.parseBooleanetc感觉像是膨胀,因为jackson做得很好 CsvSchema schema = CsvSchema.emptySchema().withHeader(); CsvMapper mapper = new CsvMapper(); ObjectReader with = mapper.readerFor(ArrayNode.class).wit

很容易将csv解析为
列表
,如中所述

然而,类型推断必须手动完成。例如,喜欢我在下面尝试做的事情?对我来说,使用
Boolean.parseBoolean
etc感觉像是膨胀,因为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
        }
    }
}
CsvSchema schema=CsvSchema.emptySchema().withHeader();
CsvMapper映射器=新的CsvMapper();
ObjectReader with=mapper.reader for(ArrayNode.class).with(schema);
enable(CsvParser.Feature.WRAP_为_数组);
JsonNode readTree=with.readTree(新文件输入流(文件));
JsonNode JsonNode=arrayNode.get(0);
if(jsonNode.isObject()){
迭代器字段=jsonNode.fields();
int计数器=0;
while(fields.hasNext()){
Entry=fields.next();
JsonNode value=entry.getValue();
if(value.isBoolean()){
//不
}else if(value.isNumber()){
//嗯
}else if(value.isTextual()){
//不
}
}
}

是否可以将CSV行解析为具有正确值类型的JsonNodes,而不依赖POJO来提供它们?

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

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

答案是肯定的。例如:

  • 您可以从头开始编写自己的CSV解析器,该解析器发出
    JsonNode
    对象
  • 您可以从现有的CSV解析器中获取
    列表
    ,应用一些启发式1将其转换为相应的
    JsonNode
    结构(无论是什么)
是否可以将CSV行解析为具有正确值类型的JsonNodes。。。使用现有的解析器

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


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


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


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

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

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

答案是肯定的。例如:

  • 您可以从头开始编写自己的CSV解析器,该解析器发出
    JsonNode
    对象
  • 您可以从现有的CSV解析器中获取
    列表
    ,应用一些启发式1将其转换为相应的
    JsonNode
    结构(无论是什么)
是否可以将CSV行解析为具有正确值类型的JsonNodes。。。使用现有的解析器

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


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


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


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

感谢您在字里行间的阅读和解释。感谢您在字里行间的阅读和解释。