2016-10-03 7 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; 
    } 
} 

これを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を生成する必要があります。

答えて

0

ジャクソン@XmlRootElementを介して提供される要素名を無視しているように、ジャクソン注釈@JsonTypeInfo@JsonSubTypesAddress又はPhoneあるContactInfoタイプを指定するために使用されるべきです。例については、https://stackoverflow.com/a/6543330/6911095を参照してください。

+0

追加プロパティなしでこれを行うことはできますか?私は、異なるサブクラスに異なるタグ名を付けることを望んでいます。 – Halley

0

あなたはルート要素を使用するようにシリアライズを設定するには、クラスレベルの注釈

  • ObjectMapperとして

    • @JsonRootNameを使用することができます。あなたはXMLとは異なる要素名を持つようにしたい場合を除きJsonRootNameを使用して

    mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); 
    

    はオプションです。

  • +0

    私は 'JsonRootName'を使ってルートクラスを設定できます。私の他のクラスはどうですか?この場合、 'Phone'クラスです。 – Halley

    +0

    なぜ最初に 'Phone'クラスに' @XmlRootElement'が必要でしょうか? – ulab

    +0

    タイプによっては、 'contact'の後のxml要素として' address'または 'phone'を指定します。 – Halley

    関連する問題