标签: jackson-dataformat-csv

使用jackson-dataformat-csv从csv解析双引号

我有一个包含以下内容的csv

EANHotelID|SequenceNumber|Name|Address1|Address2|City|StateProvince|PostalCode|Country|Latitude|Longitude|AirportCode|PropertyCategory|PropertyCurrency|StarRating|Confidence|SupplierType|Location|ChainCodeID|RegionID|HighRate|LowRate|CheckInTime|CheckOutTime
541454|99999999|Hotel Maan Residency|"B" Wing, Gopal Palace, opp. ocean park|Naherunagar-Satellite Road|Ahmedabad||380 015|IN|23.02266|72.53842|AMD|1|INR|3.0||ESR|Near Kankaria Lake|||0|0|10:00 AM|10:00 AM
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用以下代码将csv中的每一行作为一个对象读取

    CsvMapper mapper = new CsvMapper();
    mapper.findAndRegisterModules();

    File csvFile = new File("D:\\ActivePropertyList.txt.bak2");

    CsvSchema schema = CsvSchema.emptySchema().withHeader().withColumnSeparator('|').withNullValue("");
    MappingIterator<Map<String,String>> it = mapper.readerFor(Map.class).with(schema)
                .readValues(csvFile);

    while (it.hasNextValue()) {
        Map<String,String> value = it.nextValue();
    }
Run Code Online (Sandbox Code Playgroud)

但这是由于"B"csv中存在的原因而失败。我收到以下错误:

由以下原因引起:com.fasterxml.jackson.core.JsonParseException:意外的字符(“ W”(代码87)):预期的分隔符(““”(代码34))或行尾位于[来源:(com.fasterxml .jackson.dataformat.csv.impl.UTF8Reader);第2行,第43列]

如何正确解析csv中的双引号?我尝试玩耍,schema.withEscapeChar() schema.withQuoteChar()但无法正常工作。

java jackson-dataformat-csv

6
推荐指数
1
解决办法
1449
查看次数

Jackson ObjectWriter 仅写入流中的第一个条目

我想创建一个 Spring Boot 控制器,它使用流中的数据创建 CSV 文件。我使用 Jackson CSV (jackson-dataformat-csv 2.12.1) 将数据流从数据库写入 StreamingResponseBody。

为了简单起见,我将数据库中的实际数据替换为包含1, 2, 3. 我想要一个如下所示的 CSV 文件:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但它只包含第一个条目 ( 1)。有人可以帮我找出问题吗?

请注意,我不想在服务器上的某个位置创建文件,我想将内容直接流式传输给用户。

我的代码如下所示:

1
2
3
Run Code Online (Sandbox Code Playgroud)

spring jackson kotlin spring-boot jackson-dataformat-csv

6
推荐指数
1
解决办法
1781
查看次数

jackson-dataformat-csv:没有 POJO 的映射数字值

我正在尝试使用解析 CSV 文件,jackson-dataformat-csv并且我想将数字列映射到 Number java 类型。

CsvSchema schema = CsvSchema.builder().setUseHeader(true)
    .addColumn("firstName", CsvSchema.ColumnType.STRING)
    .addColumn("lastName", CsvSchema.ColumnType.STRING)
    .addColumn("age", CsvSchema.ColumnType.NUMBER)
    .build();

CsvMapper csvMapper = new CsvMapper();  

MappingIterator<Map<String, Object>> mappingIterator = csvMapper
        .readerFor(Map.class)
        .with(schema)
        .readValues(is);        

while (mappingIterator.hasNext()) {
    Map<String, Object> entryMap = mappingIterator.next();
    Number age = (Number) entryMap.get("age");
}       
Run Code Online (Sandbox Code Playgroud)

我期待entryMap.get("age")应该是 a Number,但我得到了String

我的 CSV 文件:

firstName,lastName,age
John,Doe,21
Error,Name,-10
Run Code Online (Sandbox Code Playgroud)

我知道这CsvSchema适用于 POJO,但我需要处理任意 CSV 模式,因此我无法为每种情况创建一个新的 java 类。

有什么方法可以将 CSV 解析为类型MapArray?

java csv jackson jackson-dataformat-csv

5
推荐指数
1
解决办法
3643
查看次数

jackson-dataformat-csv 不会忽略未知属性

尝试使用 jackson-dataformat-csv 解析 .csv 文件。文件包含许多与我的程序无关的列。

试图@JsonIgnoreProperties(ignoreUnknown = true)在我的数据类上使用and csvMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES),但都不起作用,并且应用程序抛出异常:

com.fasterxml.jackson.databind.RuntimeJsonMappingException: Too many entries: expected at most 2 (value #2 (17 chars) "policy_issue_date")
 at [Source: (com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader); line: 1, column: 37]

    at com.fasterxml.jackson.databind.MappingIterator.next(MappingIterator.java:194)
    at pl.polins.readers.oc.OcPolicyCsvReader.readNext(OcPolicyCsvReader.kt:25)
    at pl.polins.readers.oc.OcPolicyCsvReaderTest.should read PolicyCsv from .csv file(OcPolicyCsvReaderTest.groovy:19)
Caused by: com.fasterxml.jackson.dataformat.csv.CsvMappingException: Too many entries: expected at most 2 (value #2 (17 chars) "policy_issue_date")
 at [Source: (com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader); line: 1, column: 37]
    at com.fasterxml.jackson.dataformat.csv.CsvMappingException.from(CsvMappingException.java:23)
    at com.fasterxml.jackson.dataformat.csv.CsvParser._reportCsvMappingError(CsvParser.java:1210)
    at com.fasterxml.jackson.dataformat.csv.CsvParser._handleExtraColumn(CsvParser.java:965)
    at com.fasterxml.jackson.dataformat.csv.CsvParser._handleNextEntry(CsvParser.java:826)
    at com.fasterxml.jackson.dataformat.csv.CsvParser.nextToken(CsvParser.java:580)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:418)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1266)
    at …
Run Code Online (Sandbox Code Playgroud)

csv kotlin jackson-dataformat-csv

4
推荐指数
3
解决办法
8013
查看次数

尽管有架构配置,Jackson CsvMapper 仍无法正确反序列化为 POJO

出于某种原因,尽管配置了 FasterXML Jackson CSV 映射器来创建基于 POJO 的架构,但它坚持认为没有提供合适的配置。我收到以下异常:

com.fasterxml.jackson.databind.JsonMappingException: No value type configured for ObjectReader
com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:1371)
com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1265)
com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:897)
aol.model.core.services.admin.CSVParserService.parseCSVFileStreamAsClass(CSVParserService.java:42)
aol.rest.controller.AdminController.importCsvData(AdminController.java:30)
aol.rest.controller.AdminController$$FastClassBySpringCGLIB$$b9304c43.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
...
Run Code Online (Sandbox Code Playgroud)

我的POJO很简单

@JsonPropertyOrder({"firstName", "lastName", "age"})
public class Person {
    String firstName;
    String lastName;
    Integer age;
    public Person() {} //no other use than to avoid no-suitable-construction found issue
    //getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)

我的解析代码是

public MappingIterator<Person> parseCSVFileStreamAsClass(MultipartFile file) throws IOException {
        StringBuilder lines = new StringBuilder();
        String lineSeparator = System.getProperty("line.separator");
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
            for …
Run Code Online (Sandbox Code Playgroud)

java csv jackson-dataformat-csv jackson-databind

3
推荐指数
1
解决办法
5443
查看次数

将通用 POJO 写入 CSV 转换器

我的用例是编写一个通用的 CSV 转换器,它应该能够将任何 Java POJO 转换为 CSV 字符串。

我的实现:

public <T> List<String> convertToString(List<T> objectList) {

        List<String> stringList = new ArrayList<>();
        char delimiter = ',';
        char quote = '"';
        String lineSep = "\n";

        CsvMapper mapper = new CsvMapper();
        CsvSchema schema = mapper.schemaFor(!HOW_TO!);

        for (T object : objectList) {

            try {
                String csv = mapper.writer(schema
                        .withColumnSeparator(delimiter)
                        .withQuoteChar(quote)
                        .withLineSeparator(lineSep)).writeValueAsString(object);

            } catch (JsonProcessingException e) {

                System.out.println(e);
            }
        }

        return stringList;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Jackson-dataformat-csv 库,但我坚持使用 !HOW_TO!部分,即如何从objectList中提取对象的.class。我正在学习并遇到了类型擦除,所以我认为除了将 .class 作为我的函数的参数之外,这是不可能的。但我也使用 Java 反射从通用实体中提取此对象列表,因此我无法选择提供 .class 参数。

有解决方法吗?

或者

我可以转换具有 …

java csv generics jackson-dataformat-csv amazon-kinesis-firehose

2
推荐指数
1
解决办法
1万
查看次数

如何正确序列化和反序列化CSV?

我一直在尝试将对象序列化为CSV,String但是该对象包含List@JsonUnwrapped并且不能在List对象上使用。

预期样本输出

color,part.name\n
red,gearbox\n
red,door\n
red,bumper
Run Code Online (Sandbox Code Playgroud)

实际输出

com.fasterxml.jackson.core.JsonGenerationException: Unrecognized column 'name':
Run Code Online (Sandbox Code Playgroud)

这是我的代码:(其中大多数是2个POJO)

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import java.io.IOException;
import static java.util.Arrays.asList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class NestedWrapping {

@JsonRootName("Car")
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
@JsonPropertyOrder({"color"})
public static class Car {

    @JsonProperty("color")
    private String color;

    @JsonFormat(shape = JsonFormat.Shape.STRING) …
Run Code Online (Sandbox Code Playgroud)

java csv marshalling unmarshalling jackson-dataformat-csv

1
推荐指数
1
解决办法
5977
查看次数