2016-04-18 29 views
0

私はJacksonに特定の機能を追加しようとしています。Jackson - BeanDeserializerBase

ジャクソンが必要なタイプを要求せずにオブジェクトを逆シリアル化できるようにします。私は、クラスを直列化し、デシリアライズ時に使用されるクラス名を保持する "@class"プロパティを追加できるようにしたいと考えています。

カスタムを作成する際に問題なくクラスプロパティを追加できましたが、BeanDeserializerBaseを構築して機能させる方法が見つかりません。 "@class"フィールドを抽出して出力クラスを決定するデフォルトのデシリアライザに渡す必要があるJsonParserから削除する関数は見つかりません。

@Override 
public Object deserialize(JsonParser p, DeserializationContext ctxt) 
     throws IOException, JsonProcessingException 
{ 
    while(!p.isClosed()) 
    { 
     JsonToken t = p.nextToken(); 

     if(t.name() == "@class") 
     { 
      String cls = t.asString(); 

      try 
      { 
       Class<?> clazz = Class.forName(cls); 

       // remove @class field & default deserialize. 
      } 
      catch (ClassNotFoundException e) 
      { 

      } 
     } 
    } 
} 

誰でも助けてくれますか?私は本当に立ち往生しているように!ありがとうございました。

答えて

1

BeanDeserializerBaseを上書きする代わりに、すべてのクラスで機能するJacksonのglobal default typingをオンにすることができます。次に例を示します。

public class JacksonTypeInfo { 
    public static class Bean { 
     public final String key; 

     @JsonCreator 
     public Bean(@JsonProperty("key") final String key) {this.key = key;} 
    } 

    public static void main(String[] args) throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper() 
       .enableDefaultTypingAsProperty(
         ObjectMapper.DefaultTyping.NON_FINAL, 
         "@class"); 
     final String json = objectMapper.writeValueAsString(new Bean("value")); 
     System.out.println(json); 
     System.out.println(objectMapper.readValue(json, Object.class)); 
    } 
} 

出力:

{"@class":"stackoverflow.JacksonTypeInfo$Bean","key":"value"} 
[email protected] 
関連する問題