解组时无法获取以大写字母开头的参数值
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
在注释中。
我正在尝试使用解组来使用 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
在注释中。