2012-04-12 11 views
5

मैं जैक्सन 1.6 कोड जैकसन 2 को पोर्ट कर रहा हूं और एक बहिष्कृत कोड पर ठोकर खा रहा हूं।जैक्सन 2 कस्टम deserializer फैक्टरी

मैं जैक्सन 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 या उससे भी अधिक)। न सिर्फ एक deserializer - - उपयोग न करें SimpleModule

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

यहाँ जैक्सन 2.x में एक मॉड्यूल (इस मामले Joda तारीख से निपटने में) दर्ज की का एक उदाहरण है । अपना खुद का Module बनाएं और उसके भीतर Deserializers ऑब्जेक्ट बनाएं जो SetUpContext में जोड़ा गया है। Deserializers ऑब्जेक्ट के पास इसी तरह की विधियों तक पहुंच होगी, जिस पर कारखाने ने किया था जहां आप आवश्यक deserializer के बारे में अतिरिक्त प्रकार की जानकारी प्राप्त कर सकते हैं।

वह कुछ इस तरह (ध्यान दें कि यह एक आंतरिक वर्ग होने की जरूरत नहीं है) दिखेगा:

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

    ... 
} 
} 
1

एक कारखाने जोड़ने के लिए:

+0

क्या आप * सरल * मॉड्यूल का उपयोग नहीं कर सकते हैं? – foo

0

Exemplifying @StaxMan answer

मूल रूप से आप एक मॉड्यूल (SimpleModule) बनाने की जरूरत है, एक जोड़ने deserializer और रजिस्टर इस मॉड्यूल

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

} 
संबंधित मुद्दे