class 的 Jackson 自定义序列化程序,带有注释

Jackson Custom Serializer for class with annotations

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

例如。

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 休息 url .

最后我希望能得到一个

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"

好的,我明白了。

我最终创建了一个继承自 SimpleModule 的新模块。然后我创建了一个新的摘要 class like

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

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

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

当我得到我的对象映射器时,我只是用它注册了我的模块并进行了转换,一切都成功了。

作为旁注,我还有另一个 属性,我必须为其编写自定义序列化程序,而 @JsonUnwrapped 无法使用它。