Question

Got exception when trying to serialize/deserialize case class with optional field using lift-json.

scala> import net.liftweb.json._
import net.liftweb.json._

scala> import net.liftweb.json.Serialization.{read, write}
import net.liftweb.json.Serialization.{read, write}

scala> implicit val formats = DefaultFormats
formats: net.liftweb.json.DefaultFormats.type = net.liftweb.json.DefaultFormats$@707a7686

scala> case class Person(Name:String,Age:Option[Int])
defined class Person

scala> val friends=List(Person("Dan",Some(21)),Person("Ben",None))
friends: List[Person] = List(Person(Dan,Some(21)), Person(Ben,None))

scala> read[List[Person]](write(friends))
java.lang.InternalError: Malformed class name
    at java.lang.Class.getSimpleName(Class.java:1169)
    at net.liftweb.json.ScalaSigReader$$anonfun$findClass$3.apply(ScalaSig.scala:45)
    at net.liftweb.json.ScalaSigReader$$anonfun$findClass$3.apply(ScalaSig.scala:45)
    at scala.collection.LinearSeqOptimized$class.find(LinearSeqOptimized.scala:100)
    at scala.collection.immutable.List.find(List.scala:76)
    at net.liftweb.json.ScalaSigReader$.findClass(ScalaSig.scala:45)
    at net.liftweb.json.ScalaSigReader$.findClass(ScalaSig.scala:41)
    at net.liftweb.json.ScalaSigReader$.readConstructor(ScalaSig.scala:24)
    at net.liftweb.json.Meta$Reflection$.term$1(Meta.scala:275)
    at net.liftweb.json.Meta$Reflection$.typeParameters(Meta.scala:292)
    at net.liftweb.json.Meta$.mkContainer$1(Meta.scala:107)
    at net.liftweb.json.Meta$.fieldMapping$1(Meta.scala:134)
    at net.liftweb.json.Meta$.toArg$1(Meta.scala:154)
    at net.liftweb.json.Meta$$anonfun$constructors$1$1$$anonfun$apply$1.apply(Meta.scala:98)
    at net.liftweb.json.Meta$$anonfun$constructors$1$1$$anonfun$apply$1.apply(Meta.scala:97)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:76)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
    at scala.collection.immutable.List.map(List.scala:76)
    at net.liftweb.json.Meta$$anonfun$constructors$1$1.apply(Meta.scala:97)
    at net.liftweb.json.Meta$$anonfun$constructors$1$1.apply(Meta.scala:96)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:76)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
    at scala.collection.immutable.List.map(List.scala:76)
    at net.liftweb.json.Meta$.constructors$1(Meta.scala:96)
    at net.liftweb.json.Meta$$anonfun$mappingOf$1.apply(Meta.scala:168)
    at net.liftweb.json.Meta$$anonfun$mappingOf$1.apply(Meta.scala:160)
    at net.liftweb.json.Meta$Memo.memoize(Meta.scala:197)
    at net.liftweb.json.Meta$.mappingOf(Meta.scala:160)
    at net.liftweb.json.Extraction$.mkMapping$1(Extraction.scala:193)
    at net.liftweb.json.Extraction$.mkMapping$1(Extraction.scala:190)
    at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:198)
    at net.liftweb.json.Extraction$.extract(Extraction.scala:42)
    at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:300)
    at net.liftweb.json.Serialization$.read(Serialization.scala:58)
    at .<init>(<console>:16)
    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:73)
    at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:64)
    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)

Notes:

  1. If I use String like "case class Person(Name:String,Age:Option[String])" instead of Int, it will return the correct result.
  2. If I use "java.lang.Integer" like "case class Person(Name:String,Age:Option[java.lang.Integer])", it will return the correct result as well.

My question is why I have to use java type here? Is there a better/cleaner way to express this?

Was it helpful?

Solution

Please see the FAQ at the end of this README. Extraction does not work properly for classes that are defined in the REPL.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top