Преобразуйте case-класс, содержащий объекты, содержащие mutableMap, в json и обратно, используя lift
У меня есть класс дела как:
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)
Я получаю это исключение.
[ОШИБКА] [22.12.2016 17:11:23.784] [System-akka.actor.default-dispatcher-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(List(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(List(JField(sku_id,JString(ABC))), JField (количество,JInt(12)), JField(цена, JDouble (213.0))))))))) по адресу net.liftweb.json.Meta$.fail(Meta.scala:191) по адресу net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357) в net.liftweb.json.Extraction $.net $ liftweb $ json $ Извлечение $$build$1(Extraction.scala:317) в net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253) на net.liftweb.json. Экстракция $$ ano nfun $ 14.apply (Extraction.scala: 253) по адресу scala.collection.immutable.List.map(List.scala:277) в net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253) в сети.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286) в net.liftweb.json.Extraction $.net $ liftweb $ json $ Извлечение $$build$1(Extraction.scala:315) в net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:366) в net.liftweb.json.Extraction $.net $ liftweb $ json $ Извлечение $$extract0(Extraction.scala:199) в сети.liftweb.json.Extraction$.extract(Extraction.scala:43) в net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:312) в net.liftweb.json.Serialization$.read(Serialization.scala):58) Что мне делать?
1 ответ
Ваше поле cart_entries определено как scala.collection.mutable.Map
, JSON-сериализация Lift знает, как сериализовать Map (изменяемая или неизменяемая), но не знает, как десериализовать в изменяемую Map. Чтобы это исправить, либо определите вашу карту как scala.collection.immutable.Map
или добавить TypeHints
в ваши форматы для поддержки изменяемого типа.