java - Deserialization of map with integer keys using Jackson -


i have serialize simple integer-to-string map json , read back. serialization pretty simple, since json keys must strings resulting json looks like:

{   "123" : "hello",   "456" : "bye", } 

when read using code like:

new objectmapper().readvalue(json, map.class) 

i map<string, string> instead of map<integer, string> need.

i tried add key deserializer following:

    map<integer, string> map1 = new hashmap<>();     map1.put(1, "foo");     map1.put(2, "bar");       objectmapper mapper = new objectmapper();     simplemodule module = new simplemodule();     module.addkeydeserializer(integer.class, new keydeserializer() {         @override         public object deserializekey(string key, deserializationcontext ctxt) throws ioexception, jsonprocessingexception {             system.out.println("deserialize " + key);             return integer.parseint(key);         }     });      mapper.registermodule(module);     string json = mapper.writevalueasstring(map1);       map map2 = mapper.readvalue(json, map.class);     system.out.println(map2);     system.out.println(map2.keyset().iterator().next().getclass()); 

unfortunately key deserialzier never called , map2 in fact map<string, string>, example prints:

{1=foo, 2=bar} class java.lang.string 

what doing wrong , how fix problem?

use

map<integer, string> map2 =          mapper.readvalue(json, new typereference<map<integer, string>>(){}); 

or

    map<integer, string> map2 =          mapper.readvalue(json, typefactory.defaultinstance()                          .constructmaptype(hashmap.class, integer.class, string.class)); 

your program output below text:

deserialize 1 deserialize 2 {1=foo, 2=bar} class java.lang.integer 

Comments

Popular posts from this blog

c# - Better 64-bit byte array hash -

webrtc - Which ICE candidate am I using and why? -

php - Zend Framework / Skeleton-Application / Composer install issue -