java - Jackson xml 和 json 根元素

标签 java json xml spring-boot jackson

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

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
        }
    }]
}

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

我的代码

剩余对象

@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
}

jackson 配置

@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 格式很简单:

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 包装数组中的每个元素,你将需要一个自定义序列化程序,例如

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();
    }
}

并且只向序列化 JSON 的 ObjectMapper 注册,这样它就不会干扰到 XML 的序列化:

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

关于java - Jackson xml 和 json 根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44634080/

相关文章:

java - 通过 Java 的 SFTP 连接要求奇怪的身份验证

java - 使用 JUnit 时让 TimerTask 运行

c - ArduinoJSON 未定义对 `__cxa_guard_acquire' 的引用

java - 如何在 XML 中创建新元素?

java - Infinispan的configuration.xml在哪里找到

xml - Tomcat,JSP 应用程序中的 JAXB 编码 : Adding a schema throws exception

java - ListView 中的 Gridview 正在为每一行重复最后一个 gridview 项目

java - 如何使用另一个类中的方法从一个 java 类中的 MD 数组中删除重复项

php - 在数字上强制保留 4 个小数位而不将其类型更改为字符串

javascript - 从 JSON 列表响应对象属性获取第一段文本