2010-02-08 201 views
1

当我想反序列化json字符串时,我有一个lift-json异常。 (使用v2M1)。通过Lift-JSON序列化和反序列化json对象

基本上我有以下类:

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

,我使用

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

到jsonInString反序列化到游戏的情况下类。不幸的是我收到以下错误:

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) 

我感谢您的意见, 谢谢, -A

PS - 我想v2M2(快照@ 2010年2月10日从Scala-tools.org)异常消失,但序列化不正确!请参阅下面的评论。

回答

2

支持序列化scala.Map几天前刚刚添加。它将在一两天内发布的Lift-2.0-M2中。如果您现在需要该功能,则可以尝试每晚快照。

注意,@BeanInfo和显式的vals在case类中是不需要的。你可以只定义:

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

其实这不符合以下用例的工作(现在使用的从斯卡拉工具升JSON的快照版本): 案例类计划(方案:选项[动作] ) 案例分类游戏(游戏:Map [String,Plan]) 案例分类动作(id:Int,subAction:Option [动作]) val game = new Game(map(“a” - > new Plan一些(新的动作(1,无))))) 隐式val格式= net.liftweb.json.DefaultFormats 游戏必须等于( Serialization.read [Game](Serialization.write(game))) – 2010-02-10 16:08:25

+0

我添加了这个bug的票。以下链接显示变通方法: http://www.assembla.com/spaces/liftweb/tickets/341-Type-hints-are-needed-in-JSON-serializization-for-non-polymorphic-Map- – Joni 2010-02-11 07:45:35