【问题标题】:Jackson Custom Serializer for class with annotations带有注释的类的杰克逊自定义序列化器
【发布时间】:2015-07-11 07:57:44
【问题描述】:

我有一个复杂的对象,对于一些嵌套对象,我需要将它们序列化为 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 作为一个休息网址。

最后我希望得到一个

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"

【问题讨论】:

  • 问题在哪里?
  • 我添加了它。对不起,我分心了。
  • 但是当你将JSON反序列化回Object时,它不会反映原始结构。为什么要将所有嵌套字段组合成单个 JSON 对象?如果您能详细说明您的要求,我们可能会尝试提出更好的解决方案。
  • 我把它放在底部。我无意反序列化它。我想要一个 HashMap,我可以循环并转换为 URL 的查询参数。

标签: java serialization jackson


【解决方案1】:

好的,我想通了。

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

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

我还必须用 JsonProperty Like 注释 AnotherClass:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 2015-05-18
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多