2014-03-19 23 views
1

我有一个动态字段,其中密钥是未知的,值可以是字符串或对象。 此外,该字段本身可以是地图或只是一个值。 我该如何指导杰克逊根据它的值类型来序列化/反序列化这个字段? 我还想保存我输入的对象以在我的代码中使用,而不仅仅使用Map<String, Object>的地图。使用jackson的多个Any-Setter?

public class MyPackage { 

    @JsonProperty("versions") 
    public Versions versions = new Versions(); 

    @JsonAnySetter 
    public void add(String key, MyVersionObject value) { 
     versions.put(key, value); 
    } 

    @JsonAnyGetter 
    public Map<String, MyVersionObject> getMap() { 
     return versions; 
    } 
} 

不同JSONs,这个领域应该接受:

{ 
    "versions": { 
     "1.0": { ... MyVersionObject fields}, 
     "2.0": { ... MyVersionObject fields}, 
     "3.0": { ... MyVersionObject fields}, 
    } 
} 

或者

{ 
    "versions": { 
     "3.0": "latest" 
    } 
} 

回答

1

听起来输入是如此的不规则,你真的不能动态地进行定义。所以请留下类型的值为Object;这会给你StringMap。从此,改变自己;手动或使用ObjectMapper.convertValue()方法。