2011-12-06 13 views
2

ジャクソンは、@JsonPropertyアノテーション値(つまり、JSONプロパティキー)をBeanフィールド名で返すヘルパーメソッドを持っていますか?ジャクソンJSONの@JsonPropertyマッピングのヘルパーメソッド

コンテキスト:

私は豆の中にクライアントが提供JSONに変換するためにジャクソンを使用して、豆を検証するためにJSR-303を使用しています。検証に失敗すると、意味のあるエラーメッセージをクライアントに報告する必要があります。検証オブジェクトはBeanプロパティを参照します。エラーメッセージはJSONプロパティを参照する必要があります。したがって、一方から他方にマッピングする必要があります。

答えて

3

1を得ることが(それはほとんどジャクソンの内部使用のために設計されていますほとんどので)かなりトリッキーですが、あなたは、BeanDescriptionオブジェクトを介して情報のかなりを得ることができます。 しかし、これはいくつかのJackson拡張モジュールで使用されているので、サポートされているユースケースです。だから、:必要に応じて

ObjectMapper mapper = ...; 
JavaType type = mapper.constructType(PojoType.class); // JavaType to allow for generics 
// use SerializationConfig to know setup for serialization, DeserializationConfig for deser 
BeanDescription desc = mapper.getSerializationConfig().introspect(type); 

あなたも安全にBasicBeanDescriptionにそれをアップキャストすることができます。

これにより、多くの情報にアクセスできます。論理プロパティのリスト(それを表すgetter/setter/field/ctor-argumentを見つけることができます)、完全解決されたメソッド(注釈付き)などです。だからうまくいけば十分です。 論理プロパティは、外部名(JSONから期待されるもの)とgetter/setterから派生した内部名の両方を含んでいるので便利です。

0

私は、これを特に簡単にするためにジャクソンでは何も知らない。反射ベースの解決策で十分です。

import java.lang.reflect.Field; 

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.annotate.JsonProperty; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    // {"$food":"Green Eggs and Ham"} 
    String jsonInput = "{\"$food\":\"Green Eggs and Ham\"}"; 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    Bar bar = mapper.readValue(jsonInput, Bar.class); 

    new Jsr303().validate(bar); 
    // output: 
    // I do not like $food=Green Eggs and Ham 
    } 
} 

class Bar 
{ 
    @JsonProperty("$food") 
    String food; 
} 

class Jsr303 
{ 
    void validate(Bar bar) throws Exception 
    { 
    Field field = Bar.class.getDeclaredField("food"); 
    JsonProperty annotation = field.getAnnotation(JsonProperty.class); 
    System.out.printf("I do not like %s=%s", annotation.value(), bar.food); 
    } 
} 
関連する問題