我试图将一些API序列化从自定义映射器重写为基于注释的样式,并面对一个硬映射(之前是自定义序列化为json和xml)我无法翻译& #34;至。 (序列化是由杰克逊完成的。)
在POJO中我们有一个集合,例如
class Data {
Set<Integer> tags;
}
应该在xml中序列化,如:
<tags>
<tag id="1"/>
<tag id="2"/>
</tags>
和json一样:
{
"tags":[1,2]
}
海峡法
@XmlElementWrapper(name="tags")
@XmlElement(name="tag")
给出了好的json,但是不正确的xml像
<root>
<tags>
<tag>1<tag/>
<tag>2<tag/>
</tags>
</root>
因为没有属性规范。
我试着用:
包裹一下class Data{
@XmlElementWrapper(name="tags")
@XmlElement(name="tag")
Set<Tag> tags;
}
class Tag{
@XmlAttribute(name="id")
Integer id;
}
但这会产生json格式的不需要的密钥,例如:
"tags":[
{"tag":{"id":1}},
{"tag":{"id":2}}
]
好的,那么。我尝试指定自定义json序列化程序(实现JsonSerializer并使用@JsonSerialize注入(使用= ...)),但似乎它也影响xml&#34;渲染&#34;。
是否可以仅使用注释进行操作?或者mb是否有可能以某种方式使用默认的json序列化和自定义xml序列化? 。例如。 仅以这种方式为Reasons类使用自定义xml序列化
class Data {
@XmlElement("tags")
Reasons tags;
}
但是让所有周围的数据都是&#34;渲染&#34;一般战略。
答案 0 :(得分:0)
简单地创建一个用@JsonValue注释的getter将告诉Jackson生成一个没有任何字段名的值。
此映射:
@XmlRootElement
public class Data{
public Set<Tag> tags;
}
public class Tag{
@XmlAttribute
public Integer id;
@JsonValue
public Integer getId() {
return id;
}
}
然后会产生:
{"tags":[2,1]}
和
<data><tags id="2"/><tags id="1"/></data>
PS:你正在使用JAXB注释,我不认为杰克逊会尊重他们。
要获得上面的XML结果,您需要使用JAXB:
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(Data.class, Tag.class);
Marshaller m = context.createMarshaller();
m.marshal(value, writer);
System.out.println(writer.getBuffer().toString());
作为最后一点,我并不是使用单个映射进行多种表示的超级粉丝。它可能对简单的东西有好处,但如果你的代码变得比这更复杂,我强烈建议你创建两组类(一组用于XML映射,一组用于JSON),也许有一个通用接口。