繁体   English   中英

从XML解析后,JAXB Unmarshaller在对象中返回null

[英]JAXB Unmarshaller returning null in object after parsing from XML

我有一个带有xml数据的String对象。 我想要POJO中的数据,我尝试使用JAXB unmarshaller进行转换,但它始终为我提供对象属性中的空值。

这是我的代码:

ResponseEntity<String> response = restTemplate.getForEntity("https://api.flickr.com/services/rest/?api_key=MY_API_KEY&method=flickr.photos.search&tags=nature", String.class);    
String resp = response.getBody();

JAXBContext jaxBcontext = JAXBContext.newInstance(Resp.class);
Unmarshaller unmarshaller = jaxBcontext.createUnmarshaller();
Resp respObj = (Resp)unmarshaller.unmarshal(new StringReader(resp));

字符串中的值是:

 <rsp stat="ok">
 <photos page="1" pages="4226" perpage="100" total="422597">
 <photo id="28534349567" owner="79805131@N08" secret="b8bd7fe7cb" 
 server="843" farm="1" title="Savoie S006." ispublic="1" isfriend="0" 
 isfamily="0"/>
 <photo id="43355895332" owner="155237230@N05" secret="75fd48d040" 
 server="1769" farm="2" title="IMG_3139" ispublic="1" isfriend="0" 
 isfamily="0"/>
 <photo id="41595746070" owner="125407841@N08" secret="1f216ab8b8" 
 server="1822" farm="2" title="" ispublic="1" isfriend="0" isfamily="0"/>
 </photos>
 </rsp>

POJOS是:

 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlRootElement(name = "rsp")
 public class Resp {

    @XmlElement(name="stat")
    private String stat;

    @XmlElement(name="photos" , type = Photos.class)
    private Photos photos;

    public String getStat() {
        return stat;
    }
    //constructors and getter setters

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "photos")
public class Photos {

    @XmlElement(name="total")
    private String total;

    @XmlElement(name="page")
    private String page;

    @XmlElement(name="pages")
    private String pages;

    @XmlElement(name="perpage")
    private String perpage;

    @XmlElement(name="photo" , type=Photo.class)
    private List<Photo> photoObject = new ArrayList<Photo>();

    // constructors and getter setters.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "photo")
public class Photo {

    @XmlElement(name="id")
    private String id;

    @XmlElement(name="isfamily")
    private String isfamily;

    @XmlElement(name="title")
    private String title;

    @XmlElement(name="ispublic")
    private String ispublic;

    @XmlElement(name="owner")
    private String owner;

    @XmlElement(name="secret")
    private String secret;

    @XmlElement(name="server")
    private String server;

    @XmlElement(name="isfriend")
    private String isfriend;

    // constructors and setter getter

我得到的响应是所有这些对象中的空值。

分别[stat = null,photos =照片[total = null,page = null,pages = null,perpage = null,photo =]]

我得到的String中的值是绝对正确的,但是当我尝试将数据映射到POJO时,它开始产生错误。

就像我在其他问题中提到的那样,我使用它的另一种方法直接在对象中获取数据,但是它也存在一些问题。

RestTemplate以String形式返回数据,但不填充列表嵌套对象

如果有人可以提供帮助,那将是有帮助的。

正如@ f1sh已经提到的那样,您的问题是由POJO类中的几个问题引起的

  • 在您的XML响应中,您具有<rsp stat="ok">...</rsp> (即stat是XML属性),而不是<rsp><stat>ok</stat>...</rsp>stat是XML元素)。
    因此,在您的Resp类中,需要使用@XmlAttribute而不是@XmlElement来注释stat属性。
  • 出于相同的原因,在您的Photos类中,除photoObject属性外的所有属性都需要使用@XmlAttribute而不是@XmlElement进行注释。
  • 出于同样的原因,在您的Photo类中,所有属性都需要使用@XmlAttribute而不是@XmlElement进行注释。

需要考虑的更多最佳做法:

  • PhotosPhoto类中,可以删除@XmlRootElement批注,因为这些不是根元素。 只有Resp类是根元素,因此需要@XmlRootElement
  • Photos类中,应将photoObject属性重命名为photoObjects (带有s ),因为它是一个列表。 这将使代码更易于理解。

我找到了解决方案。

注释@XMLAttribute和@XmlElements需要放在setter上。

不适用于获取器和声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM