One of the feauture listed on Genson home page is "Serialization and Deserialization of maps with complex keys".
While I'm trying to serialize a map with Keys as complex java objects into json string, and then deserialize them back to java Map. The deserialized map keys are always strings. Can someone please help me on how to use genson for such complex key map serialization and deserialization?
Here is my code
Genson genson = new GensonBuilder().useClassMetadata(true).useRuntimeType(true).create();
VO vo = new VO();
Key key = new Key(18314212, new Timestamp(System.currentTimeMillis()),new Timestamp(System.currentTimeMillis()));
vo.setEndTime(new Timestamp(System.currentTimeMillis()));
vo.setStartTime(new Timestamp(System.currentTimeMillis()));
vo.setItemID(18314212);
vo.setKey(key);
Map<Object, Object> map = new HashMap<Object, Object>();
map.put(key, vo);
String json = genson.serialize(map);
System.out.println(json); //the json map key does not have @Class attribute
Map jsonMap = genson.deserialize(json, Map.class);
((Map.Entry)jsonMap
.entrySet().iterator().next()).getKey().getClass(); //it is always a string
--
You received this message because you are subscribed to the Google Groups "Genson user group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to genson+un...@googlegroups.com.
To post to this group, send email to gen...@googlegroups.com.
Visit this group at http://groups.google.com/group/genson.
To view this discussion on the web visit https://groups.google.com/d/msgid/genson/e397fd05-aa76-4241-b21f-63b944a1ca7b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
To view this discussion on the web visit https://groups.google.com/d/msgid/genson/4c4b96bf-d1c8-447a-8db6-8314a6cdcdca%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/genson/9eb23b9e-0469-452f-9612-21e27c6920ad%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/genson/c5b20ea0-82d0-466b-9ef3-43f81b02672c%40googlegroups.com.
Something like following code snippet
VO vo = new VO();
Key key = new Key(18314212, new Timestamp(System.currentTimeMillis()),new Timestamp(System.currentTimeMillis()));
vo.setEndTime(new Timestamp(System.currentTimeMillis()));
vo.setStartTime(new Timestamp(System.
currentTimeMillis()));
vo.setItemID(18314212);
vo.setKey(key);
Map<Object, Object> map = new HashMap<Object, Object>();
map.put(key, vo);
Map map1 = new HashMap();
map1.put("data", "12312321");
map1.put("datamap", map);
String json = genson.serialize(map1);
System.out.println(json);
Map jsonMap = genson.deserialize(json, Map.class); // throws exception fails at this line
com.owlike.genson.stream.JsonStreamException: Illegal character at row 0 and column 62 expected [ but read '"' !
at com.owlike.genson.stream.JsonReader.newWrongTokenException(JsonReader.java:951)
at com.owlike.genson.stream.JsonReader.begin(JsonReader.java:427)
at com.owlike.genson.stream.JsonReader.beginArray(JsonReader.java:151)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:153)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:1)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
at com.owlike.genson.convert.DefaultConverters$UntypedConverterFactory$UntypedConverter.deserialize(DefaultConverters.java:1074)
at com.owlike.genson.convert.ClassMetadataConverter.deserialize(ClassMetadataConverter.java:100)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.convert.DefaultConverters$CollectionConverter.deserialize(DefaultConverters.java:175)
at com.owlike.genson.convert.DefaultConverters$CollectionConverter.deserialize(DefaultConverters.java:158)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
at com.owlike.genson.convert.DefaultConverters$UntypedConverterFactory$UntypedConverter.deserialize(DefaultConverters.java:1074)
at com.owlike.genson.convert.ClassMetadataConverter.deserialize(ClassMetadataConverter.java:100)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:168)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:1)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
at com.owlike.genson.Genson.deserialize(Genson.java:306)
at com.theocc.service.client.TestDataServiceClient.testJSONDeserialization(TestDataServiceClient.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
com.owlike.genson.JsonBindingException: Could not deserialize to type interface java.util.Map
at com.owlike.genson.Genson.deserialize(Genson.java:391)
at com.owlike.genson.Genson.deserialize(Genson.java:306)
at com.theocc.service.client.TestDataServiceClient.testJSONDeserialization(TestDataServiceClient.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to type interface java.util.List
at com.owlike.genson.Genson.deserialize(Genson.java:391)
at com.owlike.genson.convert.DefaultConverters$UntypedConverterFactory$UntypedConverter.deserialize(DefaultConverters.java:1074)
at com.owlike.genson.convert.ClassMetadataConverter.deserialize(ClassMetadataConverter.java:100)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:168)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:1)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
... 31 more
Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to type interface java.util.Map
at com.owlike.genson.Genson.deserialize(Genson.java:391)
at com.owlike.genson.convert.DefaultConverters$UntypedConverterFactory$UntypedConverter.deserialize(DefaultConverters.java:1074)
at com.owlike.genson.convert.ClassMetadataConverter.deserialize(ClassMetadataConverter.java:100)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.convert.DefaultConverters$CollectionConverter.deserialize(DefaultConverters.java:175)
at com.owlike.genson.convert.DefaultConverters$CollectionConverter.deserialize(DefaultConverters.java:158)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
... 40 more
Caused by: com.owlike.genson.stream.JsonStreamException: Illegal character at row 0 and column 63 expected ] but read 'k' !
at com.owlike.genson.stream.JsonReader.newWrongTokenException(JsonReader.java:951)
at com.owlike.genson.stream.JsonReader.end(JsonReader.java:437)
at com.owlike.genson.stream.JsonReader.endArray(JsonReader.java:174)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:174)
at com.theocc.service.client.JSONMessageParser$ComplexMapConverter.deserialize(JSONMessageParser.java:1)
at com.owlike.genson.convert.RuntimeTypeConverter.deserialize(RuntimeTypeConverter.java:47)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56)
at com.owlike.genson.Genson.deserialize(Genson.java:389)
... 49 more
To view this discussion on the web visit https://groups.google.com/d/msgid/genson/b603148b-4e43-40a9-9e40-4d8e2b24bcd0%40googlegroups.com.
Hi Eugen,I am creating a generic rest interface for a cache. The aim is to allow store any java object in the cache, as long as the class of that object is in the classpath, At the same time we do not want client to adhere to any specific object format, so we did not create our wrapper object. So the rest service method accepts various arguments in the form of hashmap.
Therefore I need a heterogenous map. I'm not sure whether I could explain myself clearly. But from your responses I got a temporary workaround. In my rest client, I always convert Map to the list of keys and list of values and then send it to the server which recreates the map after deserializing the two lists.
To view this discussion on the web visit https://groups.google.com/d/msgid/genson/f486e828-21a2-4f61-91d9-a4d0119f18d1%40googlegroups.com.