簡體   English   中英

Java / Jackson:使用HashMap將JSON反序列化為類

[英]Java/Jackson: Deserialize JSON into class with HashMap

我想反序列化以下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;
  }
}

執行時

ClassContainingMap m = objectMapper.readValue(json, ClassContaininMap.class);

我懂了

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of test.ClassContainingMap: no Stri
ng-argument constructor/factory method to deserialize from String value ('key1')
 at [Source: "key1": "value1", "key2": "value2"; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012)
    at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370)
    at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:315)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1283)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2858)

我發現當使用@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填充。

您有兩個選項可以檢查;

  1. 使用正確的JSON結構作為與ClassContainingMap相對應的源
  2. 只需將其反序列化為簡單的地圖即可,例如:

     Map map = om.readValue(i, Map.class); 
  3. 並且如果以上任何一種可行,一種方法是使用@JsonCreator

     @JsonCreator(mode=Mode.DELEGATING) public ClassContainingMap(@JsonProperty("map")Map<String,String> map) { this.map = map; } @JsonValue public Map<String, String> getMap() { return map; } 

例如, 在此處查看有關3rd的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM