Java CsvMapper无法识别哈希映射
我试图序列化一个包含HashMap的对象,我得到以下异常Java CsvMapper无法识别哈希映射,java,jackson,jackson-dataformat-csv,Java,Jackson,Jackson Dataformat Csv,我试图序列化一个包含HashMap的对象,我得到以下异常 com.fasterxml.jackson.dataformat.csv.CsvMappingException: Unrecognized column 'tags': known columns: ["_id","insertDate"] (through reference chain. 另外,我不明白为什么在进行序列化时需要有一个模式。在我看来,不可能有一个无法识别的字段,因为它都是在类中指定的 因为我不太了解Jackson,所
com.fasterxml.jackson.dataformat.csv.CsvMappingException: Unrecognized column 'tags': known columns: ["_id","insertDate"] (through reference chain.
另外,我不明白为什么在进行序列化时需要有一个模式。在我看来,不可能有一个无法识别的字段,因为它都是在类中指定的
因为我不太了解Jackson,所以我搜索并尝试了这两种注释的各种组合@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;
}
}
试试第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;
}
对字段类型(而不仅仅是其初始值类型)使用
Collection
实现类HashMap
,会混淆Jackson
Jackson检查接口java.util.Map
以选择合适的序列化程序,如
com.fasterxml.jackson.databind.ser.std.MapSerializer
根据模式问题,根据
文件
需要注意的是,需要使用schema对象来确保
正确的列顺序
还请注意,虽然显式类型有助于提高效率,但它通常是
不需要,因为Jackson数据绑定可以执行常见的
转换/强制
我猜ObjectWriter.writeValueAsString(Object)
可以反射性地检查以推断序列化对象的类型
由于CSV格式的表格性质,深度嵌套的数据结构没有得到很好的支持
@JsonUnwrapped
仅用于(嵌套)POJO-s。您想要的是使用@JsonAnyGetter
。它需要返回java.util.Map
。JavaDocs:
请注意,带注释方法的返回类型必须是Map)
如果只是序列化,则不需要使用@JsonAnySetter
我很好奇你为什么用地图做标记。也许列出标签
就足够了,标签只有名称
值得一看:我们可以看看你的json吗?@Coder没有json。我创建了一个Product类型的对象,并尝试以csv序列化形式获取它。我已经尝试了您的答案,现在又出现了一个错误。也许我不理解你。请看一看更新后的问题,谢谢。您可以通过手动创建自己的模式,而不是使用Pojo.class生成的模式。将键字段添加为列,然后在映射上使用@AnyGetter。
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"])