2012-04-12 23 views
5

Tôi đang chuyển jackson mã 1.6 sang jackson 2 và vấp phải mã không được dùng nữa.Jackson2 nhà máy deserializer tùy chỉnh

gì tôi đã làm trong jackson 1.6 là:

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

Bất cứ ai cũng biết làm thế nào để làm điều đó trong jackson 2?

Trả lời

1

Trong Jackson 2.0:

  1. Tạo một Module (thường SimpleModule)
  2. xử lý Đăng ký tùy chỉnh với nó.
  3. Gọi ObjectMapper.registerModule(module);.

Tính năng này cũng khả dụng trên Jackson 1.x (từ 1.8 trở lên).

0

Dưới đây là một ví dụ về việc đăng ký một mô-đun (trong trường hợp xử lý ngày Joda này) ở Jackson 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

Để thêm một nhà máy - không chỉ là một deserializer - sử dụng đừng SimpleModule . Tạo của riêng bạn Module và bên trong nó tạo ra một đối tượng Deserializers được thêm vào SetUpContext. Đối tượng Deserializers sẽ có quyền truy cập vào các phương thức tương tự mà nhà máy đã thực hiện nơi bạn có thể nhận thêm thông tin về trình khử deserializer cần thiết.

Nó sẽ giống như thế này (lưu ý rằng nó không cần phải là một lớp bên trong):

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

bạn có thể xây dựng * tại sao * không sử dụng SimpleModule không? – foo

0

Exemplifying @StaxMan answer

Về cơ bản bạn cần phải tạo ra một mô-đun (SimpleModule), thêm một deserializer và đăng ký mô-đun này

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

Dưới đây là một ví dụ hoàn toàn

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

} 
Các vấn đề liên quan