package com.paymill.models; import java.io.IOException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; import com.fasterxml.jackson.databind.deser.ResolvableDeserializer; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; public class Deserializer<T> extends StdDeserializer<T> implements ResolvableDeserializer { private static final long serialVersionUID = -1737541287590838196L; private final JsonDeserializer<?> defaultDeserializer; public Deserializer( JsonDeserializer<?> defaultDeserializer ) { super( Client.class ); this.defaultDeserializer = defaultDeserializer; } @Override public T deserialize( JsonParser parser, DeserializationContext context ) throws IOException, JsonProcessingException { if( parser.getCurrentToken() == JsonToken.START_ARRAY ) { return null; } @SuppressWarnings( "unchecked" ) T deserializedObject = (T) defaultDeserializer.deserialize( parser, context ); return deserializedObject; } @Override public void resolve( DeserializationContext ctxt ) throws JsonMappingException { ((ResolvableDeserializer) defaultDeserializer).resolve( ctxt ); } public static SimpleModule getDeserializerModule() { SimpleModule module = new SimpleModule(); module.setDeserializerModifier( new BeanDeserializerModifier() { @Override public JsonDeserializer<?> modifyDeserializer( DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer ) { if( beanDesc.getBeanClass() == Client.class ) { return new Deserializer<Client>( deserializer ); } else if( beanDesc.getBeanClass() == Fee.class ) { return new Deserializer<Fee>( deserializer ); } else if( beanDesc.getBeanClass() == Interval.class ) { return new Deserializer<Interval>( deserializer ); } else if( beanDesc.getBeanClass() == Offer.class ) { return new Deserializer<Offer>( deserializer ); } else if( beanDesc.getBeanClass() == Payment.class ) { return new Deserializer<Payment>( deserializer ); } else if( beanDesc.getBeanClass() == Preauthorization.class ) { return new Deserializer<Preauthorization>( deserializer ); } else if( beanDesc.getBeanClass() == Refund.class ) { return new Deserializer<Refund>( deserializer ); } else if( beanDesc.getBeanClass() == Subscription.class ) { return new Deserializer<Subscription>( deserializer ); } else if( beanDesc.getBeanClass() == Transaction.class ) { return new Deserializer<Transaction>( deserializer ); } else if( beanDesc.getBeanClass() == Webhook.class ) { return new Deserializer<Webhook>( deserializer ); } else { return deserializer; } } } ); return module; } }