2016-08-02 1 views
0

Iは次のように定義されたクラスがある:@XmlElementの名前変更の影響を元に戻してjsonをアンマーシャリングしますか?

public class Contact implements Serializable 
{ 
    private final static long serialVersionUID = 1L; 
    @XmlElement(name = "last-name", required = true) 
    protected String lastName; 
    @XmlElement(name = "first-name", required = true) 
    protected String firstName; 
    @XmlElement(required = true) 
    protected String id; 
    @XmlElement(name = "primary-phone") 
    protected String primaryPhone; 
    @XmlElement(name = "cellular-phone") 
    protected String cellularPhone; 
} 

このクラスは、インターネットを介して通信されるマーシャリングJSONバージョンを生成するために使用されています。受信側ではJSONをアンマーシャルしようとしていますが、名前の違いにより難しいです。たとえば、アンマーシャリングライブラリではprimaryPhoneという名前の変数が必要ですが、受信側にあるのはprimary-phoneではありません。

primary-phoneのインスタンスをprimaryPhoneに手動で置き換えるために受け取ったJSONテキストを前処理する以外にも、この問題を回避するための自動化された方法がいくつかありますか?手動で文字列を変換する際の問題は、明日、クラス定義が変更された場合、私が書いているコードも更新する必要があるということです。

String contact = "\"last-name\": \"ahmadka\""; 
ObjectMapper objMapper = new ObjectMapper(); 
Contact cObj = objMapper.readValue(contact, Contact.class); 

しかし、上記のコードで、私はこれ読んで、最後の行に例外を取得:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "last-name" (class Contact), not marked as ignorable (5 known properties: "lastName", "cellularPhone", "id", "primaryPhone", "firstName", ]) 
at ...........//rest of the stack 

答えて

1
をここで

は、私は現在、任意の手動で文字列変換せずにやって示すコードスニペットです

ジャクソンは、デフォルトでJAXB注釈(すなわち@XmlRootElement)について知りません。この機能を使用するには、外部モジュールで構成する必要があります。サーバー上では、これを知っていなくてもほとんどの場合これを持っています。クライアント側では

あなたがObjectMapperを設定したい場合は、その後、あなたはfollowing moduleを追加する必要があります。

<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-jaxb-annotations</artifactId> 
    <version>${jackson2.version}</version> 
</dependency> 

ちょうどあなたが、私が追加した場合と言っている、それを

ObjectMapper objMapper = new ObjectMapper(); 
mapper.registerModule(new JaxbAnnotationModule()); 
+0

を設定上記の依存関係を確認してから、 'mapper.registerModule(new JaxbAnnotationModule());)を呼び出す前にアンマーシャリングする必要があります。 – Ahmad

+0

はい。それは '@XmlElement'を認識し、' lastName'の代わりにJSONをマップするために 'last-name'を使用します。 –

関連する問題