Java/Jackson:使用HashMap将JSON反序列化到类中

Java/Jackson:使用HashMap将JSON反序列化到类中,java,json,hashmap,jackson,deserialization,Java,Json,Hashmap,Jackson,Deserialization,我想反序列化以下JSON输入: { "key1": "value1", "key2": "value2" } 到包含哈希映射的类对象中: public class ClassContainingMap { private Map<String, String> map = new HashMap<>(); public Map<String, String> getMap() { return map; } publi

我想反序列化以下JSON输入:

{
  "key1": "value1",
  "key2": "value2"
}
到包含哈希映射的类对象中:

public class ClassContainingMap {

  private Map<String, String> map = new HashMap<>();

  public Map<String, String> getMap() {
     return map;
  }

  public void setMap(Map<String, String> map) {
     this.map = map;
  }
}
我明白了


我发现在用
@JsonValue
注释getter时,我可以实现另一个方向(序列化),但到目前为止,我还没有找到反序列化的方法。有没有简单的(注释?)方法来实现这一点,而不必编写自定义反序列化程序?

您没有提供如何使用
@JsonValue
注释的示例,因此我可能错过了一些东西,但无论如何

在序列化时,我认为您可以执行以下操作:

ClassContainingMap ccm = new ClassContainingMap();
ccm.getMap().put("key1", "value1");
ccm.getMap().put("key2", "value2");

System.out.println(om.writeValueAsString(ccm)); 
这将起作用并产生以下JSON:

{
    "map": {
        "key1":"value1",
        "key2":"value2",
    }
}
但这并不等于要读取到
ClassContainingMap
的JSON结构:

{
    "key1": "value1",
    "key2": "value2"
}
也就是说,前者是来自
ClassContainingMap
的数据,后者是“仅”
Map
,我认为您希望在
ClassContainingMap
中填充它

您有两个选项要检查,您可以

  • 使用正确的JSON结构作为对应于
    ClassContainingMap
  • 只需将其反序列化为一个简单的映射,如:

    Map map = om.readValue(i, Map.class);
    
  • 如果上述任何一种方法都可行,一种方法是使用
    @JsonCreator

    @JsonCreator(mode=Mode.DELEGATING)
    public ClassContainingMap(@JsonProperty("map")Map<String,String> map) {
        this.map = map;
    }
    
    @JsonValue
    public Map<String, String> getMap() {
        return map;
    }
    
    @JsonCreator(mode=mode.deleging)
    public ClassContainingMap(@JsonProperty(“map”)map){
    this.map=map;
    }
    @JsonValue
    公共地图getMap(){
    返回图;
    }
    

  • 查看有关第三个的更多信息,例如关于序列化的

    ——如果我用
    @JsonValue
    注释
    public-Map-getMap()
    ,那么它将被序列化为所需的JSON结构。关于
    1
    -不幸的是这不可能,因为它是JSON作为POST有效负载出现的,而
    2
    -是的,这可能就是我最终要做的。没什么大不了的,只是想看看是否有任何注释可以达到反序列化的等效效果(我知道这是非常特殊的用例,因为类只有一个map成员)。无论如何,谢谢@dflachbart更新了一点答案。这是一个品味的问题-我想-如果第三个比第二个更方便。也许你可以用?@Federicoperaltachaffner是的,我试过了,但它似乎不起作用Map@pirho太好了,感谢您指出
    JsonCreator
    ,这很有效!
    Map map = om.readValue(i, Map.class);
    
    @JsonCreator(mode=Mode.DELEGATING)
    public ClassContainingMap(@JsonProperty("map")Map<String,String> map) {
        this.map = map;
    }
    
    @JsonValue
    public Map<String, String> getMap() {
        return map;
    }