【问题标题】:How to generate JSON and XML from same entity classes?如何从相同的实体类生成 JSON 和 XML?
【发布时间】:2017-02-11 06:04:02
【问题描述】:

我有以下类结构。

@XmlSeeAlso({Phone.class, Address.class})
abstract class ContactInfo {

}

@XmlRootElement(name="address")
class Address extends ContactInfo {
    private String street;

    public String getStreet() {
      return street;
    }

    public void setStreet(String street) {
      this.street = street;
    }
}

@XmlRootElement(name="phone")
class Phone extends ContactInfo {
    private String mobile;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}

class Contact {
    private ContactInfo contact;

    @XmlElementRef
    public ContactInfo getContact() {
        return contact;
    }

    public void setContact(ContactInfo contact) {
        this.contact = contact;
    }
}

@XmlRootElement(name="user")
class User { 
    private String name;
    private Contact contact;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Contact getContact() {
        return contact;
    }
    public void setContact(Contact contact) {
        this.contact = contact;
    }
}

当我使用 JAXB 将其转换为 XML 时,我得到了以下结构。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
    <contact>
        <phone>
            <mobile>8971829749</mobile>
        </phone>
    </contact>
    <name>Halley</name>
</user>

我的 JSON 看起来有点不同。

{
  "User" : {
    "name" : "Halley",
    "contact" : {
      "contact" : {
        "mobile" : "8971829749"
      }
    }
  }
}

我的子 JSON 结构中根本不存在根元素用户和电话。

虽然 JAXB 尊重 XMLRootElement 注释,但 Jackson 不是。知道为什么以及如何纠正这个问题吗?

我需要从相同的实体类生成 JSON 和 XML。

【问题讨论】:

    标签: java jaxb jackson


    【解决方案1】:

    你可以使用

    • @JsonRootName 作为类级注解
    • ObjectMapper 将序列化配置为使用根元素。

    mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    

    使用JsonRootName 是可选的,除非您想使用与 XML 不同的元素名称。

    【讨论】:

    • 我可以使用JsonRootName 来配置根类。我的其他课程呢?在这种情况下,Phone 类。
    • 为什么你首先需要 @XmlRootElement 用于 Phone 类。
    • 根据类型,我希望addressphone 作为contact 之后的xml 元素。
    【解决方案2】:

    由于 Jackson 忽略了通过 @XmlRootElement 提供的元素名称,因此应该使用 Jackson 注释 @JsonTypeInfo@JsonSubTypes 来指定 ContactInfo 类型是 AddressPhone。示例见https://stackoverflow.com/a/6543330/6911095

    【讨论】:

    • 这可以在没有附加属性的情况下完成吗?可以说,我想为不同的子类使用不同的标签名称。
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2016-05-03
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多