2012-03-16 7 views
28

次のjax-bアノテーションのJackson jsonアノテーションにおけるequiv方法は何ですか?JSONフィールド名を別のオブジェクトフィールド名にマップする方法は?

xmlではなくjsonを生成する必要があり、jax-bで等価的に示される従来のjackson注釈を知る必要があります。

  1. フィールドの名前を変更します。
  2. フィールドの代わりにゲッターを使用します。

JSON/XML要素名は「new」、「public」、「static」のようなJavaの予約語 であれば、これらの機能は特に重要である、など

我々は名前を付けることがあるように"_new_"、 "_public_"、 "_static_"などのPOJOフィールドをそれぞれ

としますが、jax-bアノテーションを使用して名前を「new」、「public」、「static」などに戻します。 生成されたXML(およびjson)要素

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Person{ 
    protected String name; 
    protected String address; 
    protected boolean _restricted_ ; 
    protected boolean _new_ ; 

    @XmlElement(required = true) 
    protected String getName() {return name;} 
    @XmlElement(required = true) 
    protected String getAddress() {return address;} 
    @XmlElement(name = "contractor") 
    protected boolean getRestricted() {return _restricted_;} 
    @XmlElement(name = "new") 
    protected boolean getNew(){return _new_;} 
} 
+0

'@XmlElement(名前= "新しい")は'あなたのために動作しませんか?私はJerseyサーブレット(Jacksonを使用しています)で試してみましたが、うまくいきました。 – Danny

+0

私はRestyGWTを使用しています - この機能はRestyGWTにはないと思うので、パッチを提出しようとする前にjackson equivを知る必要があります。 –

+0

ヒントのために@BlessedGeekに感謝します。より多くの情報はhttp://wiki.fasterxml.com/AnnotationIntrospectorにあります リンクのメソッドが少し古くなっていますが、このコードを使用してシリアライザ/デシリアライザの優先順位を設定しています。 objectMapper.setAnnotationIntrospector( 新しいAnnotationIntrospectorPair( 新しいJacksonAnnotationIntrospector()、 新しいJaxbAnnotationIntrospector() ) )。 – aheryan

答えて

69

は、おそらくそれは少しだ(私はこれはそれがJAX-Bに行われている方法だと思う)プロパティのゲッターを使用して、フィールド

@XmlAccessorType(XmlAccessType.FIELD) 
public class Person{ 
    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String address; 
    @XmlElement(name = "contractor") 
    protected boolean _restricted_ ; 
    @XmlElement(name = "new") 
    protected boolean _new_ ; 
} 

リダイレクトの名前を変更する

遅いがとにかく..

プロパティの名前を変更することができます追加するだけです

@JsonProperty("contractor") 

デフォルトでは、getterとsetterを使用してシリアル化とデシリアライズを行います。詳細については

http://wiki.fasterxml.com/JacksonFAQ

+2

** @ XmlElement **で既に注釈を付けられたPersonクラス内でこの** @ JsonProperty **注釈を使用できますか?私はこのようなプロパティの値をオーバーライドしようとしました: '@JsonProperty(value =" json_Name ") @XmlElement(name =" name_provider ") public String getName(){ return name; } ' でも、とにかく私の名前の値は** name_provider **で、** json_Name ** – Nikolas

+2

はい、それは動作しているかどうかは、AnnotationIntrospectorのインクルード(ジャクソン自身のJAXB)の優先順位によって決まります。どちらも検出されますが、より優先度の高い「勝利」で登録されたものが検出されます。 – StaxMan

+0

ヒントのための@StaxManありがとう。私は、[ここ](http://wiki.fasterxml.com/AnnotationIntrospector)のコードを使用して優先度を設定しました – aheryan

関連する問題