2016-10-03 3 views
0

У меня есть структура ниже.Как сгенерировать JSON и XML из тех же классов сущностей?

@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; 
    } 
} 

Когда я преобразовываю это в XML с помощью JAXB, я получаю нижнюю структуру.

<?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" 
     } 
    } 
    } 
} 

Пользователь root-пользователя и телефон совсем не присутствуют в моей структуре JSON.

Хотя JAXB чтит аннотацию XMLRootElement, Джексон - нет. Любая идея, почему и как я могу это исправить?

Мне нужно сгенерировать JSON и XML из тех же классов сущностей.

ответ

0

В Джексон игнорирует имя элемента, установленное с помощью @XmlRootElement, Джексон аннотации @JsonTypeInfo и @JsonSubTypes должны использоваться, чтобы указать, какой ContactInfo типа Address или Phone. См. Пример https://stackoverflow.com/a/6543330/6911095.

+0

Можно ли это сделать без дополнительной собственности? Скажем, я хочу иметь другое имя тега для моих разных подклассов. – Halley

0

вы можете использовать

  • @JsonRootName в аннотации уровня класса
  • и ObjectMapper для настройки сериализации использовать корневой элемент.

mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); 

Использование JsonRootName не является обязательным, если вы не хотите иметь другое имя элемента, чем XML.

+0

Я могу использовать 'JsonRootName' для настройки корневого класса. Как насчет моих других классов? В этом случае класс «Телефон». – Halley

+0

Зачем вам нужно '@ XmlRootElement' для класса' Phone' на первом месте. – ulab

+0

в зависимости от типа, я хочу 'address' или' phone' как элемент xml после 'contact'. – Halley