解组时无法获取以大写字母开头的参数值

Unable to get the value of a parameter starting with capital letter while unmarshalling

我正在尝试使用解组来使用 xml 字符串创建对象。这是我正在使用的代码。但是我无法获取不在驼峰式大小写中的参数 (MemResponse) 的值,其余参数设置正确。

之前我没有使用jsonproperty annotation,我搜索了这个问题并了解了这个annotation。但是,使用注解后也是。 MemResponse 字段仍在获取空值。

JAXBContext jc = JAXBContext.newInstance(Transaction.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource streamSource = new StreamSource(new StringReader(content));
JAXBElement<Transaction> jaxbElement = unmarshaller.unmarshal(streamSource, Transaction.class);

交易class如下

public class Transaction
{
    private String transType;

    private String xmlDate;

    private String source;

    private String xmlVersion;

    @JsonProperty("MemResponse")
    private MemResponse MemResponse;
}

这是 MemResponse class

public class MemResponse
{
    @JsonProperty("DependantDetail")
    private DependantDetail[] DependantDetail;

    @JsonProperty("Telephone")
    private Telephone Telephone;

    @JsonProperty("Address")
    private Address[] Address;

    @JsonProperty("MemberDetail")
    private MemberDetail MemberDetail;
}

这是我的 sml 字符串

<Transaction>\n  
    <xmlVersion>1</xmlVersion>\n
    <xmlDate>25/11/2011</xmlDate>\n
    <source>MACROMOBI</source>\n
    <transType>MEMDETAIL</transType>\n
    <MemResponse>\n    
        <MemberDetail>\n      
            <joinDate>01/07/2007</joinDate>\n
            <leftDate>31/01/2008</leftDate>\n
            <employerCode></employerCode>\n
            <depCount>2</depCount>\n
            <langPref>ENG</langPref>\n
            <nextMemberNo/>\n
            <nextPlanCode/>\n
        </MemberDetail>\n
        <DependantDetail>\n      
            <depNum>01</depNum>\n
            <initials>G</initials>\n
            <depTitle>MR</depTitle>\n
            <gender>M</gender>\n
            <maritalStatus>S</maritalStatus>\n
            <joinDate>01/07/2007</joinDate>\n
            <leftDate>31/01/2008</leftDate>\n
            <relation>SELF</relation>\n
            <depType>PM</depType>\n
        </DependantDetail>\n
        <DependantDetail>\n      
            <depNum>02</depNum>\n
            <initials>S</initials>\n
            <depTitle>MRS</depTitle>\n
            <birthDate>20/11/1944</birthDate>\n
            <gender>F</gender>\n
            <maritalStatus>S</maritalStatus>\n
            <joinDate>01/07/2007</joinDate>\n
            <benefitStart>01/07/2007</benefitStart>\n
            <leftDate>31/01/2008</leftDate>\n
        </DependantDetail>\n
        <Telephone>\n      
            <contType>MVWORK</contType>\n
            <dialCode>+</dialCode>\n
            <dialNum>5</dialNum>\n
            <smsFlag/>\n
        </Telephone>\n
        <Address>\n      
            <contType>PM</contType>\n
            <addr02>MORNINGSIDE</addr02>\n
            <addr04/>\n
            <town>MUTARE</town>\n
            <postCode>0000</postCode>\n
        </Address>\n
        <Address>\n      
            <contType>RM</contType>\n
            <addr02>MORNINGSIDE</addr02>\n
            <addr03>MUTARE</addr03>\n
            <addr04/>\n
            <postCode>0000</postCode>\n
        </Address>\n
    </MemResponse>\n
</Transaction>\n

您不能使用 @JsonProperty 反序列化您的事务对象,因为您正在处理 XML 并且 @JsonProperty 特定于 JSON。

相反,在 Transaction class 上添加 @XmlRootElement 注释,并在所有字段上添加 @XmlElement 注释。下面是你的 Transaction class 应该是什么样子,我将留给你对 MemResponse 和其他 classes 进行相同的更改:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Transaction {
    @XmlElement
    private String transType;

    @XmlElement
    private String xmlDate;

    @XmlElement
    private String source;

    @XmlElement
    private String xmlVersion;

    @XmlElement(name = "MemResponse")
    private MemResponse memResponse;
}

如果元素名称与字段名称匹配,则不必在 @XmlElement 注释中指定 name。但是,作为示例,我为 memResponse 字段提供了一个初始小写字母,以符合字段的 Java 命名约定,并指定这应使用元素名称 MemResponse 在注释中。