2012-04-12 7 views
5

私はjackson 1.6コードをjackson 2に移植しており、非難されたコードを見つけました。私はジャクソン1.6でやったJackson2カスタムデシリアライザ工場

は次のとおりです。

CustomDeserializerFactory sf = new CustomDeserializerFactory(); 
mapper.setDeserializerProvider(new StdDeserializerProvider(sf)); 
sf.addSpecificMapping(BigDecimal.class, new BigDecimalDeserializer()); 
t = mapper.readValue(ts, X[].class); 

誰でもジャクソン2でそれを行う方法を知っていますか?ジャクソン2.0で

答えて

1

  1. はそれでModule(通常SimpleModule
  2. 登録するカスタムハンドラを作成します。
  3. ObjectMapper.registerModule(module);を呼び出します。

これは、ジャクソン1.xでも(1.8以上から)利用可能です。ここで

0

ジャクソン2.xの中で(この場合はジョダの日付処理)モジュールを登録する例です:

ClientConfig clientConfig = new DefaultClientConfig(); 

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(new JodaModule()); 
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 

    JacksonJsonProvider provider = new JacksonJsonProvider(); 
    provider.configure(SerializationFeature.INDENT_OUTPUT, true); 
    provider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

    provider.setMapper(mapper); 
    clientConfig.getSingletons().add(provider); 

    Client client = Client.create(clientConfig); 
1

を工場追加するには - だけでなく、デシリアライザ - ドントの使用をSimpleModule 。独自のModuleを作成し、Deserializersオブジェクトを作成してSetUpContextに追加します。 Deserializersオブジェクトは、必要なデシリアライザに関する追加の型情報を得ることができる工場が行ったのと同様のメソッドにアクセスできます。

それは、この(それは内部クラスである必要はないことに注意してください)のようなものになります。基本的に追加、モジュール(SimpleModule)を作成する必要があり

public class MyCustomCollectionModule extends Module { 

@Override 
public void setupModule(final SetupContext context) { 
    context.addDeserializers(new MyCustomCollectionDeserializers()); 
} 

private static class MyCustomCollectionDeserializers implements Deserializers { 

    ... 

    @Override 
    public JsonDeserializer<?> findCollectionDeserializer(final CollectionType type, final DeserializationConfig config, final BeanDescription beanDesc, final TypeDeserializer elementTypeDeserializer, final JsonDeserializer<?> elementDeserializer) throws JsonMappingException { 

     if (MyCustomCollection.class.equals(type.getRawClass())) { 
      return new MyCustomCollectionDeserializer(type); 
     } 
     return null; 
    } 

    ... 
} 
} 
+0

*なぜ* SimpleModuleを使用しないのですか? – foo

0

Exemplifying @StaxMan answer

をデシリアライザおよび登録ここでは、このモジュール

final SimpleModule sm = new SimpleModule(); 
     sm.addDeserializer(Date.class, new JsonDeserializer<Date>(){ 

      @Override 
      public Date deserialize(JsonParser p, DeserializationContext ctxt) 
        throws IOException { 
       try { 
        System.out.println("from my custom deserializer!!!!!!"); 
        return new SimpleDateFormat("yyyy-MM-dd").parse(p.getValueAsString()); 
       } catch (ParseException e) { 
        System.err.println("aw, it fails: " + e.getMessage()); 
        throw new IOException(e.getMessage()); 
       } 
      } 
     }); 

     final CreationBean bean = JsonUtils.getMapper() 
       .registerModule(sm) 
//    .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) 
       .readValue("{\"dateCreation\": \"1995-07-19\"}", CreationBean.class); 

完全に例

import java.io.IOException; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonDeserializer; 
import com.fasterxml.jackson.databind.module.SimpleModule; 

/** 
* @author elvis 
* @version $Revision: $<br/> 
*   $Id: $ 
* @since 8/22/16 8:38 PM 
*/ 
public class JackCustomDeserializer { 

    public static void main(String[] args) throws IOException { 

     final SimpleModule sm = new SimpleModule(); 
     sm.addDeserializer(Date.class, new JsonDeserializer<Date>(){ 

      @Override 
      public Date deserialize(JsonParser p, DeserializationContext ctxt) 
        throws IOException { 
       try { 
        System.out.println("from my custom deserializer!!!!!!"); 
        return new SimpleDateFormat("yyyy-MM-dd").parse(p.getValueAsString()); 
       } catch (ParseException e) { 
        System.err.println("aw, it fails: " + e.getMessage()); 
        throw new IOException(e.getMessage()); 
       } 
      } 
     }); 

     final CreationBean bean = JsonUtils.getMapper() 
       .registerModule(sm) 
//    .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) 
       .readValue("{\"dateCreation\": \"1995-07-19\"}", CreationBean.class); 

     System.out.println("parsed bean: " + bean.dateCreation); 
    } 

    static class CreationBean { 
     public Date dateCreation; 
    } 

}