Фабрика пользовательских десериализаторов Jackson2

Я портирую код Джексона 1.6 на Джексон 2 и наткнулся на устаревший код.

Что я сделал в Джексоне 1.6:

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

Кто-нибудь знает, как это сделать в Джексоне 2?

Ответы на вопрос(4)

Пример ответа @StaxMan

В основном вам нужно создать модуль (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: 
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;
    }

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

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

SimpleModule, Создайте свой собственныйModule и внутри него создатьDeserializers объект, который добавляется кSetUpContext,Deserializers Объект будет иметь доступ к аналогичным методам, которые использовались на фабрике, где вы можете получить дополнительную информацию о типе необходимого десериализатора.

Это будет выглядеть примерно так (обратите внимание, что это не обязательно должен быть внутренний класс):

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

    ...
}
}
 02 дек. 2017 г., 21:59
не могли бы вы уточнитьwhy не использовать SimpleModule?
Решение Вопроса

Create a Module (usually SimpleModule) Register custom handlers with it. Call ObjectMapper.registerModule(module);.

Это доступно и в Jackson 1.x (начиная с версии 1.8 или около того).

Ваш ответ на вопрос