从错误来看,我想相信它与您的架构有关Car
,其中的列为{"color"}
取自@JsonPropertyOrder
on Car
而不是一个"name"
value.
您可能想添加"parts"
在那里,但你会得到同样的错误"name"
不是该模式的一部分。
对代码进行一些更改后,我能够序列化和反序列化Car
目的。
Part
在这里,经过一些其他更改后,它需要一个具有单个 String 值的构造函数,因此添加
@JsonPropertyOrder({"name"})
public static class Part {
@JsonProperty("name")
private String name;
public Part() {
this("");
}
public Part(String partJSON) {
// TODO: Unserialize the parameter... it is a serialized Part string...
this.name = partJSON;
}
Car
在这里,您需要实现一个方法来转换List<Part>
手动转换为 CSV 可读格式。
这样的方法看起来像这样
@JsonGetter("parts")
public String getPartString() {
String separator = ";";
StringBuilder sb = new StringBuilder();
Iterator<Part> iter = this.parts.iterator();
while (iter.hasNext()) {
Part p = iter.next();
sb.append(p.getName());
if (iter.hasNext())
sb.append(separator);
}
return sb.toString();
}
另外,不要忘记修复类顶部的架构
@JsonPropertyOrder({"color", "parts"})
public static class Car {
@JsonProperty("color")
private String color;
@JsonProperty("parts")
private List<Part> parts;
public Car() {
this.parts = new ArrayList<>();
}
连载
你可以改变你的serialize
方法将类的类型作为泛型类型参数而不是显式类型参数Class
像这样。
public static final synchronized <T> String serialize(final T object, final Boolean withHeaders) throws IOException {
CsvMapper csvMapper = new CsvMapper();
CsvSchema csvSchema = csvMapper.schemaFor(object.getClass());
if (withHeaders) {
csvSchema = csvSchema.withHeader();
} else {
csvSchema = csvSchema.withoutHeader();
}
return csvMapper.writer(csvSchema).writeValueAsString(object);
}
主要作家
现在,如果你序列化一个Car
,你应该看到
color,parts
red,gearbox;door;bumper
主要读者
读取 CSV 字符串并循环Car.getParts()
Car car = mapper.readerFor(Car.class).with(csvSchema).readValue(csv);
for (Part p : car.getParts()) {
System.out.println(p.getName());
}
gearbox
door
bumper