杰克逊xml和json根元素

编程入门 行业动态 更新时间:2024-10-27 14:28:02
本文介绍了杰克逊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根元素

本文发布于:2023-08-01 12:24:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1268290.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:杰克逊   元素   xml   json

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!