gpt4 book ai didi

java - 使用 JacksonRepresentation 编写多行 CSV

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:59 24 4
gpt4 key购买 nike

我正在开发一个 ReSTLet servlet,它应该能够以不同格式(目前为 XML、JSON、CSV)提供多行数据。

我已经决定使用 Jackson 将我的 POJO 映射到不同的格式,并尝试使用 JacksonRepresentation(ReSTLet 扩展)来实现此目的,但我在使 CSV 位正常工作时遇到了一些问题。

如果我使用以下任一 JacksonRepresentation 构造函数:

List<MyBean> beansList = getBeans(); // Query database etc.
MyBean[] beansArr = beansList.toArray(new MyBean[beansList.size()]);

// Tried all the following
JacksonRepresentation<MyBean[]> result = new JacksonRepresentation<MyBean[]>(MediaType.TEXT_CSV, beansArr);

JacksonRepresentation<List<MyBean>> result = new JacksonRepresentation<List<MyBean>>(MediaType.TEXT_CSV, beansList);

JacksonRepresentation<ListWrapper> result = new JacksonRepresentation<ListWrapper>(MediaType.TEXT_CSV, new ListWrapper(beansList));

JacksonRepresentation<ArrayWrapper> result = new JacksonRepresentation<ArrayWrapper>(MediaType.TEXT_CSV, new ArrayWrapper(beansArr));


// Explicit schema shouldn't be necessary, since the beans are already annotated
CsvSchema csvSchema = CsvSchema.builder()
.addColumn("productcode", ColumnType.STRING)
.addColumn("quantity", ColumnType.NUMBER)
.build();

result.setCsvSchema(csvSchema);

return result;

我遇到异常:

com.fasterxml.jackson.core.JsonGenerationException: Unrecognized column 'productcode': known columns: ]

但是如果我坚持一个对象/行:

JacksonRepresentation<MyBean> result = new JacksonRepresentation<MyBean>(MediaType.TEXT_CSV, beansArr[0]);

我得到了一个很好用的 CSV 文件,其中包含一行数据。

对于 JSON,数组包装器方法似乎是对多个对象执行此操作的方法,但我一生都无法弄清楚如何制作多行 CSV...

示例 bean 和包装器:

@JsonPropertyOrder({ "productcode", "quantity" ... })
public class MyBean {

private String productcode;

private float quantity;

public String getProductcode() {
return productcode;
}

public void setProductcode(String productcode) {
this.productcode = productcode;
}

.
.
.
}


public class ListWrapper {

private List<MyBean> beans;

public ListWrapper(List<MyBean> beans) {
setBeans(beans);
}

public void setBeans(List<MyBean> beans) {
this.beans = beans;
}

public List<MyBean> getBeans() {
return beans;
}
}

public class ArrayWrapper {

private MyBean[] beans;

public ArrayWrapper(MyBean[] beans) {
setBeans(beans);
}

public void setBeans(MyBean[] beans) {
this.beans = beans;
}

public MyBean[] beans getBeans() {
return beans;
}
}

最佳答案

我认为当前代码中有一个错误。 CSV 映射器未正确计算。

我已为此输入了一个问题 ( https://github.com/restlet/restlet-framework-java/issues/928 ),感谢您报告此问题。

作为解决方法,我建议您创建 JacksonRepresentation,如下所示:

rep = new JacksonRepresentation<MyBean[]>(MediaType.TEXT_CSV, tab) {
@Override
protected ObjectWriter createObjectWriter() {
CsvMapper csvMapper = (CsvMapper) getObjectMapper();
CsvSchema csvSchema = csvMapper.schemaFor(MyBean.class);
ObjectWriter result = csvMapper.writer(csvSchema);
return result;
}
};

它也适用于 beans 列表。

关于java - 使用 JacksonRepresentation 编写多行 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24569318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com