将包含mutableMap的对象的case类转换为json并使用lift返回

时间:2016-12-22 11:49:13

标签: json lift mutablemap

我有一个案例类:

case class Cart(cart_id :UUID, cart_entries :Map[String,CartEntry]){

  //override def toString: String = "Saini CartId = " + cart_id.toString

}

我正在使用net.liftweb.json._将其转换为json:

implicit val formats = Serialization.formats(NoTypeHints) + new UUIDserializer
val json = write(cart)
println(json)

Json出现了

{"cart_id":"68eb787f-746c-4320-9ef4-8b5c7f0d7e21","cart_entries":[{"_1":"ABC","_2":{"sku_id":"ABC","quantity":12,"price":213.0}}]}

将我的json转换回购物车对象时:

val jValue = read[Cart](json)

我得到了这个例外。

  

[错误] [12/22/2016 17:11:23.784]   [系统-akka.actor.default-调度-3]   [akka:// System / user / 68eb787f-746c-4320-9ef4-8b5c7f0d7e21]不可用   cart_entries的值       没有类型接口的构造函数scala.collection.mutable.Map,JArray(List(JObject(List(JField(_1,JString(ABC)),   JField(_2,JObject(名单(JField(sku_id,的jstring(ABC)),   JField(数量,JInt(12)),JField(价格,JDouble(213.0)))))))))       net.liftweb.json.MappingException:cart_entries没有可用值       没有类型接口的构造函数scala.collection.mutable.Map,JArray(List(JObject(List(JField(_1,JString(ABC)),   JField(_2,JObject(名单(JField(sku_id,的jstring(ABC)),   JField(数量,JInt(12)),JField(价格,JDouble(213.0)))))))))         在net.liftweb.json.Meta $ .fail(Meta.scala:191)         at net.liftweb.json.Extraction $ .mkValue $ 1(Extraction.scala:357)         at net.liftweb.json.Extraction $ .net $ liftweb $ json $ Extraction $$ build $ 1(Extraction.scala:317)         在net.liftweb.json.Extraction $$ anonfun $ 14.apply(Extraction.scala:253)         在net.liftweb.json.Extraction $$ anonfun $ 14.apply(Extraction.scala:253)         在scala.collection.immutable.List.map(List.scala:277)         at net.liftweb.json.Extraction $ .instantiate $ 1(Extraction.scala:253)         at net.liftweb.json.Extraction $ .newInstance $ 1(Extraction.scala:286)         at net.liftweb.json.Extraction $ .net $ liftweb $ json $ Extraction $$ build $ 1(Extraction.scala:315)         at net.liftweb.json.Extraction $ .net $ liftweb $ json $ Extraction $$ extract0(Extraction.scala:366)         at net.liftweb.json.Extraction $ .net $ liftweb $ json $ Extraction $$ extract0(Extraction.scala:199)         at net.liftweb.json.Extraction $ .extract(Extraction.scala:43)         在net.liftweb.json.JsonAST $ JValue.extract(JsonAST.scala:312)         at net.liftweb.json.Serialization $ .read(Serialization.scala:58)         我该怎么办?

1 个答案:

答案 0 :(得分:1)

您的cart_entries字段定义为scala.collection.mutable.Map。 Lift的JSON序列化知道如何序列化Map(可变或不可变),但它不知道如何反序列化为可变Map。要解决此问题,请将地图定义为scala.collection.immutable.Map或将TypeHints添加到您的格式中以支持可变类型。