Java春天。将棘手的序列化注释为json和xml

时间:2016-08-29 19:23:49

标签: java json xml spring serialization

我试图将一些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;一般战略。

1 个答案:

答案 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),也许有一个通用接口。