我有一个复杂的对象,对于一些嵌套对象,我需要将它们序列化为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>
我可以循环并从。
创建apacheBasicNameValuePairs
下面是我想要用于最终结果的一些代码,如果我可以正确地序列化所有内容。
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"
答案 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不适用。