[Lift] Re: json extraction problem
Cool, thanks Joni. I'll give it a try. On Thu, Oct 1, 2009 at 2:36 AM, Joni Freeman wrote: > > Hi, > > I pasted this to scala console and it worked. I am pretty sure that > the problem is that your case classes are inner classes. Inner classes > get one extra implicit constructor parameter, a reference to the outer > class (same way as in Java). You need to move those case classes away > from enclosing class (to an object or package etc.). > > The error message is very bad in this case. I will fix it. > > Cheers Joni > > On Oct 1, 7:49 am, Lincoln wrote: > > Hi, I've been playing around with lift-json and I keep running into basic > > problems. I'm hoping someone can point out my mistake. > > I'm using "net.liftweb" % "lift-json" % "1.1-M5" > > > > Here's the code I'm trying to run: > > > > implicit val formats = net.liftweb.json.DefaultFormats > > case class Name(first: String, last: String) > > case class User(name: Name, email: String) > > import net.liftweb.json.JsonParser._ > > val u = { > > import JsonDSL._ > > ("name" -> > > ("first" -> "Lincoln") ~ > > ("last" -> "Hochberg") > > ) ~ > > ("email" -> "linxbet...@gmail.com")} > > > > val json = JsonDSL.pretty(JsonAST.render(u)) > > val jsonAST = JsonParser.parse(json) > > val user = jsonAST.extract[User] > > > > This blows up with the following exception: > > > > net.liftweb.json.MappingException: Parsed JSON values do not match with > > class constructor > > args= > > arg types= > > constructor=public > > pkg.TestSpec$$anonfun$1$$anonfun$apply$1(pkg.TestSpec$$anonfun$1) > > at > > > net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$fail(Extraction.scala:151) > > at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:72) > > at net.liftweb.json.Extraction$.build$1(Extraction.scala:84) > > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > > at scala.List.flatMap(List.scala:1132) > > at net.liftweb.json.Extraction$.build$1(Extraction.scala:84) > > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > > at scala.List.flatMap(List.scala:1132) > > at net.liftweb.json.Extraction$.build$1(Extraction.scala:84) > > at net.liftweb.json.Extraction$.extract0(Extraction.scala:109) > > at net.liftweb.json.Extraction$.extract(Extraction.scala:60) > > at net.liftweb.json.JsonAST$JValue.extract(Json.scala:109) > > at > > > com.hotpotato.core.ops.TestSpec$$anonfun$1$$anonfun$apply$1.apply(TestSpec.scala:48) > > at > > > com.hotpotato.core.ops.TestSpec$$anonfun$1$$anonfun$apply$1.apply(TestSpec.scala:14) > > at > > > org.specs.specification.ExampleExecution$$anonfun$3$$anonfun$apply$1.apply(Example.scala:207) > > at org.specs.specification.Example.execute(Example.scala:121) > > at > > > org.specs.specification.ExampleLifeCycle$class.executeTest(ExampleLifeCycle.scala:20) > > at org.specs.Specification.executeTest(Specification.scala:28) > > at org.specs.specification.Sus.executeTest(Sus.scala:147) > > at > > > org.specs.specification.ExampleExecution$$anonfun$3.apply(Example.scala:207) > > at > > > org.specs.specification.ExampleExecution$$anonfun$3.apply(Example.scala:194) > > at > > > org.specs.specification.ExampleExecution$$anonfun$2.apply(Example.scala:185) > > at org.specs.specification.ExampleExecution.execute(Example.scala:227) > > at org.specs.specification.Example.execute(Example.scala:117) > > at org.specs.specification.Example.errors(Example.scala:143) > > at org.specs.specification.Sus$$anonfun$successes$1.apply(Sus.scala:122) > > at org.specs.specification.Sus$$anonfun$successes$1.apply(Sus.scala:122) > > at scala.List.filter(List.scala:859) > > at org.specs.specification.Sus.successes(Sus.scala:122) > > at > > > org.specs.Specification$$anonfun$successes$1.apply(Specification.scala:84) > > at > > > org.specs.Specification$$anonfun$successes$1.apply(Specification.scala:84) > > at scala.List.flatMap(List.scala:1132) > > at org.specs.Specification.successes(Specification.scala:84) > > at > > > sbt.impl.SpecsRunner.sbt$impl$SpecsRunner$$reportSpecification(TestFrameworkImpl.scala:140) > > at sbt.impl.SpecsRunner.runTest(TestFrameworkImpl.scala:123) > > at sbt.BasicTestRunner.run(TestFramework.scala:38) > > at > > > sbt.TestFramework$$anonfun$7$$anonfun$apply$8.runTest$1(TestFramework.scala:136) > > at > > > sbt.TestFramework$$anonfun$7$$anonfun$apply$8$$anonfun$apply$9.apply(TestFramework.scala:147) > > at > > > sbt.TestFramework$$anonfun$7$$anonfun$apply$8$$anonfun$apply$9.apply(TestFramework.scala:147) > > at sbt.NamedTestTask.run(TestFramework.scala:57) > > at > > > sbt.ScalaProject$$anonfun$sbt$ScalaProject$$toTask$1.apply(ScalaProject.scala:167) > > at > > > sbt.ScalaProject$$anonfun$sbt$ScalaProject$$toTask$1.apply(ScalaProject.scala:167) > > at sbt.TaskManager$Task.invoke(TaskManager.scala:62) > > at sbt.impl.RunTask.runTask(RunTask.scala:78)
[Lift] Re: json extraction problem
Hi, I pasted this to scala console and it worked. I am pretty sure that the problem is that your case classes are inner classes. Inner classes get one extra implicit constructor parameter, a reference to the outer class (same way as in Java). You need to move those case classes away from enclosing class (to an object or package etc.). The error message is very bad in this case. I will fix it. Cheers Joni On Oct 1, 7:49 am, Lincoln wrote: > Hi, I've been playing around with lift-json and I keep running into basic > problems. I'm hoping someone can point out my mistake. > I'm using "net.liftweb" % "lift-json" % "1.1-M5" > > Here's the code I'm trying to run: > > implicit val formats = net.liftweb.json.DefaultFormats > case class Name(first: String, last: String) > case class User(name: Name, email: String) > import net.liftweb.json.JsonParser._ > val u = { > import JsonDSL._ > ("name" -> > ("first" -> "Lincoln") ~ > ("last" -> "Hochberg") > ) ~ > ("email" -> "linxbet...@gmail.com")} > > val json = JsonDSL.pretty(JsonAST.render(u)) > val jsonAST = JsonParser.parse(json) > val user = jsonAST.extract[User] > > This blows up with the following exception: > > net.liftweb.json.MappingException: Parsed JSON values do not match with > class constructor > args= > arg types= > constructor=public > pkg.TestSpec$$anonfun$1$$anonfun$apply$1(pkg.TestSpec$$anonfun$1) > at > net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$fail(Extraction.scala:151) > at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:72) > at net.liftweb.json.Extraction$.build$1(Extraction.scala:84) > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > at scala.List.flatMap(List.scala:1132) > at net.liftweb.json.Extraction$.build$1(Extraction.scala:84) > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > at net.liftweb.json.Extraction$$anonfun$1.apply(Extraction.scala:84) > at scala.List.flatMap(List.scala:1132) > at net.liftweb.json.Extraction$.build$1(Extraction.scala:84) > at net.liftweb.json.Extraction$.extract0(Extraction.scala:109) > at net.liftweb.json.Extraction$.extract(Extraction.scala:60) > at net.liftweb.json.JsonAST$JValue.extract(Json.scala:109) > at > com.hotpotato.core.ops.TestSpec$$anonfun$1$$anonfun$apply$1.apply(TestSpec.scala:48) > at > com.hotpotato.core.ops.TestSpec$$anonfun$1$$anonfun$apply$1.apply(TestSpec.scala:14) > at > org.specs.specification.ExampleExecution$$anonfun$3$$anonfun$apply$1.apply(Example.scala:207) > at org.specs.specification.Example.execute(Example.scala:121) > at > org.specs.specification.ExampleLifeCycle$class.executeTest(ExampleLifeCycle.scala:20) > at org.specs.Specification.executeTest(Specification.scala:28) > at org.specs.specification.Sus.executeTest(Sus.scala:147) > at > org.specs.specification.ExampleExecution$$anonfun$3.apply(Example.scala:207) > at > org.specs.specification.ExampleExecution$$anonfun$3.apply(Example.scala:194) > at > org.specs.specification.ExampleExecution$$anonfun$2.apply(Example.scala:185) > at org.specs.specification.ExampleExecution.execute(Example.scala:227) > at org.specs.specification.Example.execute(Example.scala:117) > at org.specs.specification.Example.errors(Example.scala:143) > at org.specs.specification.Sus$$anonfun$successes$1.apply(Sus.scala:122) > at org.specs.specification.Sus$$anonfun$successes$1.apply(Sus.scala:122) > at scala.List.filter(List.scala:859) > at org.specs.specification.Sus.successes(Sus.scala:122) > at > org.specs.Specification$$anonfun$successes$1.apply(Specification.scala:84) > at > org.specs.Specification$$anonfun$successes$1.apply(Specification.scala:84) > at scala.List.flatMap(List.scala:1132) > at org.specs.Specification.successes(Specification.scala:84) > at > sbt.impl.SpecsRunner.sbt$impl$SpecsRunner$$reportSpecification(TestFrameworkImpl.scala:140) > at sbt.impl.SpecsRunner.runTest(TestFrameworkImpl.scala:123) > at sbt.BasicTestRunner.run(TestFramework.scala:38) > at > sbt.TestFramework$$anonfun$7$$anonfun$apply$8.runTest$1(TestFramework.scala:136) > at > sbt.TestFramework$$anonfun$7$$anonfun$apply$8$$anonfun$apply$9.apply(TestFramework.scala:147) > at > sbt.TestFramework$$anonfun$7$$anonfun$apply$8$$anonfun$apply$9.apply(TestFramework.scala:147) > at sbt.NamedTestTask.run(TestFramework.scala:57) > at > sbt.ScalaProject$$anonfun$sbt$ScalaProject$$toTask$1.apply(ScalaProject.scala:167) > at > sbt.ScalaProject$$anonfun$sbt$ScalaProject$$toTask$1.apply(ScalaProject.scala:167) > at sbt.TaskManager$Task.invoke(TaskManager.scala:62) > at sbt.impl.RunTask.runTask(RunTask.scala:78) > at sbt.impl.RunTask.sbt$impl$RunTask$$runIfNotRoot(RunTask.scala:63) > at sbt.impl.RunTask$$anonfun$runTasksExceptRoot$3.apply(RunTask.scala:49) > at sbt.impl.RunTask$$anonfun$runTasksExceptRoot$3.apply(RunTask.scala:49) > at sbt.Distributor$Run$Worker$$anonfun$2.apply(ParallelRunner.scala:130) > at sbt.Distributor$Run$Worker$$an