CsvMapper无法识别的哈希映射



我正在尝试序列化一个包含哈希图的对象,并得到以下异常。

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

相关内容

  • 没有找到相关文章

最新更新