Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CsvMapper无法识别哈希映射_Java_Jackson_Jackson Dataformat Csv - Fatal编程技术网

Java CsvMapper无法识别哈希映射

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,所

我试图序列化一个包含HashMap的对象,我得到以下异常

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"])