From e0c09823d26d27b109b79efcc504ce0fed408d47 Mon Sep 17 00:00:00 2001 From: Alexandre Campelo Date: Tue, 6 Jan 2015 16:27:47 -0800 Subject: [PATCH] Adding currency deserialization support in maps --- .../databind/deser/std/StdKeyDeserializer.java | 12 +++++++++++- .../databind/deser/TestMapDeserialization.java | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java index a3745528687..acb4f1f852c 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java @@ -6,6 +6,7 @@ import java.net.URI; import java.net.URL; import java.util.Calendar; +import java.util.Currency; import java.util.Date; import java.util.Locale; import java.util.UUID; @@ -46,6 +47,7 @@ public class StdKeyDeserializer extends KeyDeserializer public final static int TYPE_URI = 13; public final static int TYPE_URL = 14; public final static int TYPE_CLASS = 15; + public final static int TYPE_CURRENCY = 16; final protected int _kind; final protected Class _keyClass; @@ -104,6 +106,9 @@ public static StdKeyDeserializer forType(Class raw) } else if (raw == Locale.class) { FromStringDeserializer deser = FromStringDeserializer.findDeserializer(Locale.class); return new StdKeyDeserializer(TYPE_LOCALE, raw, deser); + } else if (raw == Currency.class) { + FromStringDeserializer deser = FromStringDeserializer.findDeserializer(Currency.class); + return new StdKeyDeserializer(TYPE_CURRENCY, raw, deser); } else { return null; } @@ -183,7 +188,12 @@ protected Object _parse(String key, DeserializationContext ctxt) throws Exceptio } catch (IOException e) { throw ctxt.weirdKeyException(_keyClass, key, "unable to parse key as locale"); } - + case TYPE_CURRENCY: + try { + return _deser._deserialize(key, ctxt); + } catch (IOException e) { + throw ctxt.weirdKeyException(_keyClass, key, "unable to parse key as currency"); + } case TYPE_DATE: return ctxt.parseDate(key); case TYPE_CALENDAR: diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestMapDeserialization.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestMapDeserialization.java index 615cd62db4c..b62380733d8 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/TestMapDeserialization.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestMapDeserialization.java @@ -463,6 +463,19 @@ public void testLocaleKeyMap() throws Exception { assertEquals(key, ob); } + public void testCurrencyKeyMap() throws Exception { + Currency key = Currency.getInstance("USD"); + String JSON = "{ \"" + key + "\":4}"; + Map result = MAPPER.readValue(JSON, new TypeReference>() { + }); + assertNotNull(result); + assertEquals(1, result.size()); + Object ob = result.keySet().iterator().next(); + assertNotNull(ob); + assertEquals(Currency.class, ob.getClass()); + assertEquals(key, ob); + } + // Test confirming that @JsonCreator may be used with Map Key types public void testKeyWithCreator() throws Exception {