0

我正在尝试反序列化以下 XML。

<RESPONSE>
    <FIELDS>
        <FIELD KEY="MSG_VERSION">003</FIELD>
        <FIELD KEY="CUSTOMER_NBR">001</FIELD>
        ...
        <FIELD KEY="ORIGINAL_TYPE">RM1</FIELD>
    </FIELDS>
</RESPONSE>

我需要从KEY属性和值中捕获值。以下是我创建的 Java 类。

package io.app.domain;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JacksonXmlRootElement(localName = "RESPONSE")
public class ResponseData {
    @JacksonXmlElementWrapper(localName = "FIELDS")
    @JacksonXmlProperty(localName = "FIELD")
    private List<Field> fields = new ArrayList<>();
    @Data
    public static class Field {
        @JacksonXmlProperty(isAttribute = true)
        private String key;
        @JacksonXmlText(value = true)
        private String content;
    }
}

XmlMapper按如下方式初始化。

private final XmlMapper xmlMapper = new XmlMapper();

xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

问题是,尽管content正确设置,但key值始终为null。我在这里做错了什么?

4

2 回答 2

1

正如@Thomas 在对该帖子的评论中指出的那样,导致问题的正是该物业的情况。

@JacksonXmlProperty(isAttribute = true, localName = "KEY")
private String key;

这是解决办法。

于 2022-02-14T07:59:25.773 回答
0

或者你可以像下面这样。(我没试过)。更具可读性。

@JacksonXmlRootElement(localName = "RESPONSE")
class ResponseFields {

    @JacksonXmlProperty(localName = "FIELDS")
    @JacksonXmlElementWrapper(useWrapping = false)
    private Fields[] fields;

    //getters, setters, toString
}


class Fields {
    @JacksonXmlProperty(localName = "FIELD")
    private Field[] field;

    //getters, setters, toString
}

class Field {
    @JacksonXmlProperty(isAttribute = true)
    private String key;
    @JacksonXmlText(value = true)
    private String value;

    //getters, setters, toString
}

接着;

XmlMapper mapper = new XmlMapper();
ResponseFields responseFields = mapper.readValue(XML, ResponseFields.class);
System.out.println(responseFields);
于 2022-02-14T08:05:03.893 回答