diff --git a/src/main/java/com/mangopay/MangoPayApi.java b/src/main/java/com/mangopay/MangoPayApi.java index 6c8f081f..b7d603c2 100644 --- a/src/main/java/com/mangopay/MangoPayApi.java +++ b/src/main/java/com/mangopay/MangoPayApi.java @@ -6,6 +6,9 @@ import com.mangopay.core.APIs.implementation.*; import com.mangopay.core.AuthorizationTokenManager; import com.mangopay.core.Configuration; +import com.mangopay.core.deserializer.CardInfoTypeDeserializer; +import com.mangopay.core.enumerations.CardInfoType; +import com.mangopay.core.serializer.CardInfoTypeSerializer; import com.mangopay.entities.RateLimit; import java.util.List; @@ -55,6 +58,11 @@ public MangoPayApi() { setVirtualAccountApi(new VirtualAccountApiImpl(this)); setConversionsApi(new ConversionsApiImpl(this, gsonBuilder)); setIdentityVerificationApi(new IdentityVerificationApiImpl(this)); + + // register custom serializers/deserializers for objects that are used in multiple APIs + gsonBuilder.registerTypeAdapter(CardInfoType.class, new CardInfoTypeSerializer()); + gsonBuilder.registerTypeAdapter(CardInfoType.class, new CardInfoTypeDeserializer()); + setGson(gsonBuilder.create()); } diff --git a/src/main/java/com/mangopay/core/deserializer/CardInfoTypeDeserializer.java b/src/main/java/com/mangopay/core/deserializer/CardInfoTypeDeserializer.java new file mode 100644 index 00000000..1dd04aaa --- /dev/null +++ b/src/main/java/com/mangopay/core/deserializer/CardInfoTypeDeserializer.java @@ -0,0 +1,23 @@ +package com.mangopay.core.deserializer; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.mangopay.core.enumerations.CardInfoType; + +import java.lang.reflect.Type; + +public class CardInfoTypeDeserializer implements JsonDeserializer { + @Override + public CardInfoType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String value = json.getAsString(); + if ("null".equals(value)) { + return null; + } + if ("CHARGE CARD".equals(value)) { + return CardInfoType.CHARGE_CARD; + } + return CardInfoType.valueOf(value); + } +} diff --git a/src/main/java/com/mangopay/core/serializer/CardInfoTypeSerializer.java b/src/main/java/com/mangopay/core/serializer/CardInfoTypeSerializer.java new file mode 100644 index 00000000..dc407bdf --- /dev/null +++ b/src/main/java/com/mangopay/core/serializer/CardInfoTypeSerializer.java @@ -0,0 +1,19 @@ +package com.mangopay.core.serializer; + +import com.google.gson.*; +import com.mangopay.core.enumerations.CardInfoType; + +import java.lang.reflect.Type; + +public class CardInfoTypeSerializer implements JsonSerializer { + @Override + public JsonElement serialize(CardInfoType src, Type typeOfSrc, JsonSerializationContext context) { + if (src == null) { + return JsonNull.INSTANCE; + } + if (src == CardInfoType.CHARGE_CARD) { + return new JsonPrimitive("CHARGE CARD"); + } + return new JsonPrimitive(src.name()); + } +} diff --git a/src/test/java/com/mangopay/entities/GsonTest.java b/src/test/java/com/mangopay/entities/GsonTest.java new file mode 100644 index 00000000..93fa33bf --- /dev/null +++ b/src/test/java/com/mangopay/entities/GsonTest.java @@ -0,0 +1,32 @@ +package com.mangopay.entities; + +import com.mangopay.core.BaseTest; +import com.mangopay.core.enumerations.CardInfoType; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class GsonTest extends BaseTest { + @Test + public void testSerializeCardInfoType() { + CardInfoType type = CardInfoType.CHARGE_CARD; + String json = getApi().getGson().toJson(type); + assertEquals("\"CHARGE CARD\"", json); + + type = null; + json = getApi().getGson().toJson(type); + assertEquals("null", json); + } + + @Test + public void testDeserializeCardInfoType() { + String jsonInput = "\"CHARGE CARD\""; + CardInfoType deserialized = getApi().getGson().fromJson(jsonInput, CardInfoType.class); + assertEquals(CardInfoType.CHARGE_CARD, deserialized); + + jsonInput = "null"; + deserialized = getApi().getGson().fromJson(jsonInput, CardInfoType.class); + assertNull(deserialized); + } +}