Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Deserialization of Maps with any key type #20

Open
lambdaknight opened this issue Jun 21, 2011 · 4 comments
Open

Deserialization of Maps with any key type #20

lambdaknight opened this issue Jun 21, 2011 · 4 comments

Comments

@lambdaknight
Copy link

Right now, Jerkson only supports deserializing maps with a String, Int, or Long key. Please support deserializing maps with any type of key.

@sroebuck
Copy link

I think I'm encountering this issue.

I want to parse the following:

val s = """{"event":"form","id":"xsD7n7h4rPem6pg0M1Bv19r","data":[{"name":"name","value":"Fred Bloggs"},{"name":"email","value":"fred@company.com"}]}"""

Trying this with jerkson (com.codahale.jerkson.Json.parse(s)) gives:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to scala.runtime.Nothing$
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:914)
    at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:546)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:577)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
    at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:694)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:745)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:651)
    at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:542)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:550)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
    at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:851)
    at xsbt.ConsoleInterface.run(ConsoleInterface.scala:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:57)
    at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:48)
    at sbt.Console.console0$1(Console.scala:23)
    at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
    at sbt.TrapExit$.executeMain$1(TrapExit.scala:33)
    at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)

However, using the twitter Json parser (com.twitter.json.Json.parse(s)) correctly gives:

Map(event -> form, id -> xsD7n7h4rPem6pg0M1Bv19r, data -> List(Map(name -> name, value -> Fred Bloggs), Map(name -> email, value -> fred@company.com)))

@sroebuck
Copy link

I have found that I can get most of the way with deserialising maps using:

Json.parse[Map[String, JValue]](json)

for a map between a String key and any kind of value. The resulting JValue needs post-processing but it's mostly useable. However, problems come up as soon as I have a JSON string containing the String or value "null". The above line then gives the error:

com.codahale.jerkson.ParsingException: Can not deserialize instance of com.codahale.jerkson.AST$JValue out of VALUE_NULL token

It seems that it doesn't support "null" as a valid JValue in this context.

@sroebuck
Copy link

Okay, this isn't perfect, but with Coda's assistance I have discovered that Jerkson supports Option types, so, in the above example:

Json.parse[Map[String, Option[JValue]]](json)

works nicely, but for a fuller explanation see my comment on another issue here: #41 (comment)

@aloiscochard
Copy link

What about fixing this? 8 months old...

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants