杰克逊xml和json根元素 [英] Jackson xml and json root element

查看:105
本文介绍了杰克逊xml和json根元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个以JSON和XML格式返回对象的服务。

I have a service which returns objects in JSON and XML format.

http:// localhost:8091 / apiN / xml / 2

XML结果

<restObjectList>
    <restObjectList>
        <restObjectList>
            <timestamp>2017-06-19 17:01:01</timestamp>
            <title>Rest object</title>
            <fullText>This is the full text. ID: 1</fullText>
            <id>1</id>
            <value>0.1412789210135622</value>
        </restObjectList>
        <restObjectList>
            <timestamp>2017-06-19 17:01:01</timestamp>
            <title>Rest object</title>
            <fullText>This is the full text. ID: 2</fullText>
            <id>2</id>
            <value>0.9886539664938628</value>
        </restObjectList>
    </restObjectList>
</restObjectList>

http:// localhost:8091 / apiN / 2

JSON结果

{
    "restObjectList": [
        {
            "timestamp": "2017-06-19 17:01:01",
            "title": "Rest object",
            "fullText": "This is the full text. ID: 1",
            "id": 1,
            "value": 0.1412789210135622
        },
        {
            "timestamp": "2017-06-19 17:01:01",
            "title": "Rest object",
            "fullText": "This is the full text. ID: 2",
            "id": 2,
            "value": 0.9886539664938628
        }
    ]
}

结果我想收到

xml

<restObjectList>
    <restObject>
        <timestamp>2017-06-19 17:01:01</timestamp>
        <title>Rest object</title>
        <fullText>This is the full text. ID: 1</fullText>
        <id>1</id>
        <value>0.1412789210135622</value>
    </restObject>
    <restObject>
        <timestamp>2017-06-19 17:01:01</timestamp>
        <title>Rest object</title>
        <fullText>This is the full text. ID: 2</fullText>
        <id>2</id>
        <value>0.9886539664938628</value>
    </restObject>
</restObjectList>

json

{
    "restObjectList": [{
        "restObject": {
            "timestamp": "2017-06-19 17:01:01",
            "title": "Rest object",
            "fullText": "This is the full text. ID: 1",
            "id": 1,
            "value": 0.1412789210135622
        }
    }, {
        "restObject": {
            "timestamp": "2017-06-19 17:01:01",
            "title": "Rest object",
            "fullText": "This is the full text. ID: 2",
            "id": 2,
            "value": 0.9886539664938628
        }
    }]
}

如何包装 restObject 用于JSON和XML并修复 restObjectList 的XML数据,因为此标记在不同级别重复。

How do I wrap restObject for JSON and XML and fix XML data for restObjectList because this tag is repeated at different levels.

我的代码

RestObject

@JsonRootName(value = "restObject")
@XmlRootElement(name = "restObject")
public class RestObject implements Serializable {

    private LocalDateTime timestamp;
    private String title;
    private String fullText;
    private Long id;
    private Double value;

    //Getters, setters
}

RestObjectList

@JsonRootName(value = "restObjectList")
@XmlSeeAlso({RestObject.class})
public class RestObjectList {

    private List<RestObject> restObjectList;

    //Getter and setter
}

JacksonConfig

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(true).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//Use custom date-time format.
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
        objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
        return objectMapper;
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
        objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
        return objectMapper;
    }
}


推荐答案

JSON和XML结构不相同。在XML中你需要一个 RestObject 的列表,在JSON中你需要一个列表,其元素在另一个对象中包装 RestObject 的实例。这不是一个简单的Jackson注释可以得到的东西,你需要一个仅用于JSON序列化的自定义序列化器。首先,获得所需的XML格式很简单:

The JSON and XML structures are not equivalent. In XML you want a list of RestObject and in JSON you want a list whose elements wrap instances of RestObject in another object. This isn't something you can get with a simple Jackson annotation, you would need a custom serializer only for JSON serialization. First of all, getting the desired XML format is straightforward:

class RestObject implements Serializable {
    private LocalDateTime timestamp;
    private String title;
    private String fullText;
    private Long id;
    private Double value;
}

@JsonRootName("restObjectList")
class RestObjectList {
    @JacksonXmlProperty(localName = "restObject")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<RestObject> restObjectList;
}

如果你绝对想要在json中包装数组中的每个元素你会需要自定义序列化程序,例如

If you absolutely want to wrap each element in the array in json you'll need a custom serializer e.g.

class RestObjectSerializer extends JsonSerializer<RestObject> {
    @Override
    public void serialize(RestObject value, JsonGenerator gen, SerializerProvider serializers) throws
            IOException {
        gen.writeStartObject();
        gen.writeObjectFieldStart("restObject");
        gen.writeObjectField("timeStamp", value.getTimestamp());
        gen.writeStringField("title", value.getTitle());
        // other fields
        gen.writeEndObject();
        gen.writeEndObject();
    }
}

仅注册 ObjectMapper 序列化JSON,因此它不会干扰序列化为XML:

And register only with the ObjectMapper that serializes JSON so it doesn't interfere with serialization to XML:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("MyModule");
module.addSerializer(RestObject.class, new RestObjectSerializer());
mapper.registerModule(module);

这篇关于杰克逊xml和json根元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆