2010-02-08 7 views
1

J'ai une exception de lift-json lorsque je souhaite désérialiser une chaîne json. (en utilisant v2M1).sérialisation et désérialisation d'un objet json via Lift-JSON

Fondamentalement, j'ai la classe suivante:

@BeanInfo 
case class Game(val id:Int, 
val bad:Map[String,Plan], 
val good:Map[String,Plan]) 

et je me sers

net.liftweb.json.Serialization.read[Game](jsonInString) 

désérialiser le jsonInString dans une classe de cas de jeu. Malheureusement, je reçois l'erreur suivante:

net.liftweb.json.MappingException: Can't find primary constructor for class interface scala.collection.immutable.Map 
at net.liftweb.json.Meta$.fail(Meta.scala:93) 
at net.liftweb.json.Meta$Reflection$$anonfun$primaryConstructorOf$1.apply(Meta.scala:129) 
at net.liftweb.json.Meta$Reflection$$anonfun$primaryConstructorOf$1.apply(Meta.scala:129) 
at scala.Option.getOrElse(Option.scala:61) 
at net.liftweb.json.Meta$Reflection$.primaryConstructorOf(Meta.scala:129) 
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:106) 
at net.liftweb.json.Extraction$.build$1(Extraction.scala:119) 
at net.liftweb.json.Extraction$$anonfun$2$$anonfun$apply$1.apply(Extraction.scala:119) 
at net.liftweb.json.Extraction$$anonfun$2$$anonfun$apply$1.apply(Extraction.scala:119) 
at scala.List.flatMap(List.scala:1132) 
at net.liftweb.json.Extraction$$anonfun$2.apply(Extraction.scala:119) 
at net.liftweb.json.Extraction$$anonfun$2.apply(Extraction.scala:119) 
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:106) 
at net.liftweb.json.Extraction$.build$1(Extraction.scala:119) 
at net.liftweb.json.Extraction$.extract0(Extraction.scala:154) 
at net.liftweb.json.Extraction$.extract(Extraction.scala:37) 
at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:247) 
at net.liftweb.json.Serialization$.read(Serialization.scala:50) 

Je vous remercie de vos commentaires, Merci, -A

PS - J'ai essayé v2M2 (instantané @ 10 février 2010 à partir Scala-tools.org), l'exception a disparu mais la sérialisation n'est pas correcte! Voir les commentaires ci-dessous.

Répondre

2

La prise en charge de la sérialisation de scala.Map vient d'être ajoutée il y a quelques jours. Ce sera dans Lift-2.0-M2 qui sortira dans un jour ou deux. Si vous avez besoin de cette fonctionnalité maintenant, vous pouvez essayer l'instantané nocturne.

Remarque, @BeanInfo et les vals explicites ne sont pas nécessaires dans les classes de cas. Vous pouvez simplement définir:

case class Game(id: Int, bad: Map[String, Plan], good:Map[String,Plan]) 
+0

En fait, cela ne fonctionne pas avec le cas d'utilisation suivant (en utilisant maintenant la libération de l'instantané de Lift-JSON des outils de scala): cas plan de classe (régime: Option [Action] case class Jeu (jeu: Carte [Chaîne, Plan]) case class Action (id: Int, sousAction: Option [Action]) val jeu = nouveau Jeu (Carte ("a" -> nouveau Plan (nouveau Certains (nouvelle Action (1, aucune))))) implicite val formats = net.liftweb.json.DefaultFormats jeu doit êtreEqualTo ( Serialization.read [Jeu] (Serialization.write (jeu))) –

+0

J'ai ajouté un ticket pour ce bug. Le lien suivant montre une solution de rechange: http://www.assembla.com/spaces/liftweb/tickets/341-Type-hints-are-needed-in-JSON-serializization-for-non-polymorphic-Map- – Joni

Questions connexes