杰克逊如何使用自定义getter / setter序列化地图?

时间:2012-01-25 20:36:52

标签: java reflection map jackson

我在jackson中有一个bean,它使用@JSonAnySetter方法在地图中存储所有未知参数。

@JSonAnySetter
handleUnkowns(String k, Object v) 
{
   myMap.put(k,v); 
}

我将其用作所有数据类型的“基础bean”,因此如果数据丢失,则填充未知参数并且数据不会丢失....而不是jackson崩溃。

但是,我希望这些未知数的序列化形式不能嵌套 - 也就是说 - 当序列化对象时,我希望序列化参数位于对象的顶层。另外,我希望自定义字段也可以序列化:

//I want this map to be serialized/deserialized : {"collarWidth":10 "name":"fido"}
class Dog extens JSonBean 
{
     int collarWidth=0;
     getCollarWidth(){return collarWidth;}
     setCollarWidth(int x){collarWidth=x;}
}

请注意,在上述情况下 - 由于我从Map扩展,将发生Jackson的自定义Map序列化,并且unknownParameters将成为我json中的“field”。

因此预期的JSON序列化将是
{“collarWidth”:10“unknownParameters”:{“name”:“fido”}}

而不是

{“collarWidth”:10“name”:“fido”}

那么 - 将未知参数与已知参数“合并”的最简单方法是什么,以便java bean序列化程序保留与输入字符串相同的嵌套?

显而易见的解决方案是将“myMap”对象中的参数与序列化地图合并,但这看起来有点过分,我认为这个问题可能有更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

您是否签出了@JsonAnyGetter注释?该方法返回的地图将被解包,以使其与@JsonAnySetter一起使用。 This blog entry解释了用法。