Added the ability to deserialize a Map "key" object from a String into a complex Java type.
This commit is contained in:
parent
970446e997
commit
02decace26
|
@ -485,11 +485,12 @@ final class DefaultTypeAdapters {
|
||||||
throws JsonParseException {
|
throws JsonParseException {
|
||||||
// Use ObjectConstructor to create instance instead of hard-coding a specific type.
|
// Use ObjectConstructor to create instance instead of hard-coding a specific type.
|
||||||
// This handles cases where users are using their own subclass of Map.
|
// This handles cases where users are using their own subclass of Map.
|
||||||
Map<String, Object> map = constructMapType(typeOfT, context);
|
Map<Object, Object> map = constructMapType(typeOfT, context);
|
||||||
Type childType = new TypeInfoMap(typeOfT).getValueType();
|
TypeInfoMap mapTypeInfo = new TypeInfoMap(typeOfT);
|
||||||
for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
|
for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
|
||||||
Object value = context.deserialize(entry.getValue(), childType);
|
Object key = context.deserialize(new JsonPrimitive(entry.getKey()), mapTypeInfo.getKeyType());
|
||||||
map.put(entry.getKey(), value);
|
Object value = context.deserialize(entry.getValue(), mapTypeInfo.getValueType());
|
||||||
|
map.put(key, value);
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.google.gson.functional;
|
package com.google.gson.functional;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
@ -126,6 +127,23 @@ public class MapTest extends TestCase {
|
||||||
assertNull(map.get(null));
|
assertNull(map.get(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMapSerializationWithIntegerKeys() {
|
||||||
|
Map<Integer, String> map = new LinkedHashMap<Integer, String>();
|
||||||
|
map.put(123, "456");
|
||||||
|
Type typeOfMap = new TypeToken<Map<Integer, String>>() {}.getType();
|
||||||
|
String json = gson.toJson(map, typeOfMap);
|
||||||
|
|
||||||
|
assertEquals("{\"123\":\"456\"}", json);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testMapDeserializationWithIntegerKeys() {
|
||||||
|
Type typeOfMap = new TypeToken<Map<Integer, String>>() {}.getType();
|
||||||
|
Map<Integer, String> map = gson.fromJson("{\"123\":\"456\"}", typeOfMap);
|
||||||
|
assertEquals(1, map.size());
|
||||||
|
assertTrue(map.containsKey(123));
|
||||||
|
assertEquals("456", map.get(123));
|
||||||
|
}
|
||||||
|
|
||||||
public void testParameterizedMapSubclassSerialization() {
|
public void testParameterizedMapSubclassSerialization() {
|
||||||
MyParameterizedMap<String, String> map = new MyParameterizedMap<String, String>();
|
MyParameterizedMap<String, String> map = new MyParameterizedMap<String, String>();
|
||||||
map.put("a", "b");
|
map.put("a", "b");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user