我正在尝试序列化一个包含哈希图的对象,并得到以下异常。
com.fasterxml.jackson.dataformat.csv.CsvMappingException: Unrecognized column 'tags': known columns: ["_id","insertDate"] (through reference chain.
另外,我不明白为什么在序列化时必须有一个架构。在我看来,没有办法有一个无法识别的字段,因为它都是在类中指定的。
因为我不太了解杰克逊,所以我搜索并尝试了这两个注释的各种组合。@JsonUnwrapped
@JsonAnyGetter
class Product{
public @Id String _id;
@JsonUnwrapped
private HashMap<String, String> tags = new HashMap<>();
public String insertDate;
@JsonAnyGetter
public HashMap<String, String> getTags() {
return tags;
}
@JsonAnySetter
public void setTags(HashMap<String, String> tags) {
this.tags = tags;
}
}
用于序列化的代码
CsvSchema schema = csvMapper.schemaFor(Product.class).withHeader();
ObjectWriter myObjectWriter = csvMapper.writer(schema);
csvMapper.enable(CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE);
csvMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
string = myObjectWriter.writeValueAsString(someProduct);
尝试 NR 2
public class Product {
public @Id String _id;
public Map<String, String> tags = new HashMap<>();
public String insertDate;
@JsonAnyGetter
public Map<String, String> getTags() {
return tags;
}
@JsonAnySetter
public void setTags(Map<String, String> tags) {
this.tags = tags;
}
}
新错误
com.fasterxml.jackson.dataformat.csv.CsvMappingException: CSV generator does not support Object values for properties (nested Objects) (through reference chain: main.model.Product["tags"])
Collection
字段类型(而不仅仅是其初始值类型)使用实现类HashMap<String, String>
会使杰克逊感到困惑。
杰克逊检查接口java.util.Map
以选择正确的序列化程序,如构造函数所示
com.fasterxml.jackson.databind.ser.std.MapSerializer
根据架构问题,根据 杰克逊-数据格式-CSV 文档
请务必注意,需要架构对象来确保 列的正确排序;
另请注意,虽然显式类型可以帮助提高效率,但通常 不需要,因为杰克逊数据绑定可以做常见 转换/胁迫
我想ObjectWriter.writeValueAsString(Object)
可以反射性地检查以推断序列化对象的类型。
由于 CSV 格式的表格性质,深度嵌套数据结构没有得到很好的支持。
@JsonUnwrapped
仅适用于(嵌套)POJO-s。你想要的是使用@JsonAnyGetter
.它需要返回java.util.Map
.JavaDocs:
请注意,带注释的方法的返回类型必须是 Map)。
如果只是序列化,则不需要@JsonAnySetter
。
我很好奇你为什么要使用地图作为标签。也许List<String> tags
就足够了,标签只有名称。
值得一试: https://www.baeldung.com/jackson-mapping-dynamic-object