通过Lift-JSON序列化和反序列化json对象
问题描述:
当我想反序列化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)异常消失,但序列化不正确!请参阅下面的评论。
答
支持序列化scala.Map几天前刚刚添加。它将在一两天内发布的Lift-2.0-M2中。如果您现在需要该功能,则可以尝试每晚快照。
注意,@BeanInfo和显式的vals在case类中是不需要的。你可以只定义:
case class Game(id: Int, bad: Map[String, Plan], good:Map[String,Plan])
其实这不符合以下用例的工作(现在使用的从斯卡拉工具升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
我添加了这个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