I have a Map containing a mixture of types like in this simple example
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("a", 1);
map.put("b", "a");
map.put("c", 2);
final Gson gson = new Gson();
final String string = gson.toJson(map);
final Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
final Map<Object, Object> map2 = gson.fromJson(string, type);
for (final Entry<Object, Object> entry : map2.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
What I get back are plain Objects, no Integers, no Strings. The output looks like
a : java.lang.Object@48d19bc8
b : java.lang.Object@394a8cd1
c : java.lang.Object@4d630ab9
Can I fix it somehow? I’d expect that such simple cases will be handled correctly by default.
I know that the information about the type can’t always be preserved, and possibly 1 and "1" means exactly the same in JSON. However, returning plain content-less objects just makes no sense to me.
Update: The serialized version (i.e. the string above) looks fine:
{"a":1,"b":"a","c":2}
Gson isn’t that smart. Rather provide a clear and static data structure in flavor of a Javabean class so that Gson understands what type the separate properties are supposed to be deserialized to.
E.g.
in combination with
Update: as per the comments, the keyset seems to be not fixed (although you seem to be able to convert it manually afterwards without knowing the structure beforehand). You could create a custom deserializer. Here’s a quick’n’dirty example.
which you use as follows: