Jackson Custom Serializer用于带注释的课程

时间:2015-05-01 13:22:58

标签: java serialization jackson

我有一个复杂的对象,对于一些嵌套对象,我需要将它们序列化为JSON字段而不是JSON对象。

EG。

public class Outer {
    private String someField;
    private AnotherClass anotherField;
}

public class AnotherClass {
    @XmlElement(name = "useThisName")
    private String someField;
    private String anotherField;
}

如何创建一个适用于嵌套对象的自定义序列化程序并遵循注释,以便正确命名字段?

我的用例是使用ObjectMapper.convertValue()方法创建Map,以便我可以遍历它并为其余网址创建NameValuePairs

最后我希望最终得到一个

Map<String, String> 

我可以循环并从。

创建apache BasicNameValuePairs

下面是我想要用于最终结果的一些代码,如果我可以正确地序列化所有内容。

Map<String, String> parameters
        = DefaultJacksonMapper.getDefaultJacksonMapper().convertValue(obj, LinkedHashMap.class);

        return parameters
        .entrySet()
        .stream()
        .map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());

如果我现在将其转换为地图,我的输出就像:

"someField" -> "data"
"anotherField" -> "size = 2"

我想让Map得到以下输出,我觉得我需要一个自定义序列化器。

"someField" -> "data"
"useThisName" -> "data"
"anotherField" -> "data"

1 个答案:

答案 0 :(得分:1)

好的,我想出来了。

我最终创建了一个继承SimpleModule的新模块。然后我创建了一个新的抽象类,如

public abstract class OuterMixin {
    @JsonUnwrapped
    private AnotherClass anotherField;
}

我还必须使用JsonProperty注释AnotherClass,如:

public class AnotherClass {
    @XmlElement(name = "useThisName")
    @JsonProperty("useThisName")
    private String someField;
    private String anotherField;
}

当我拿到我的Object Mapper时,我只是用它注册了我的模块并进行了转换,这一切都完成了。

作为附注,我有另一个属性,我必须编写一个自定义序列化程序,而@JsonUnwrapped不适用。