2012-04-12 16 views
5

我將jackson 1.6代碼移植到jackson 2,並偶然發現了一個不推薦的代碼。Jackson2定製解串器工廠

我在傑克遜1.6所做的是:

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

任何人知道如何做到這一點在傑克遜2?

回答

1

在傑克遜2.0:

  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對象,並將其添加到SetUpContextDeserializers對象可以訪問類似的方法,工廠就可以獲取有關所需解串器的額外類型信息。

它看起來像這樣(請注意,它並不需要是一個內部類):

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 2017-12-02 20:59:12

0

Exemplifying @StaxMan answer

基本上你需要創建一個模塊(SimpleModule),加解串器和寄存器該模塊

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; 
    } 

}