2016-12-22 4 views
0

У меня есть класс случая, как:класса случае Преобразовать содержащие объекты, содержащие mutableMap в JSON и обратно, используя подъемную

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: // Система/пользователь/68eb787f-746c-4320 -9ef4-8b5c7f0d7e21] Нет использования Значение для cart_entries Нет конструктора для интерфейса типа scala.collection.mutable.Map, JArray (Список (JObject (Список (JField (_1, JString (ABC)), JField (_2, JObject (Список (JField (sku_id, JString (ABC)), JField (количество, JInt (12)), JField (цена, JDouble (213.0))))))))) net.liftweb.json.MappingException: Нет использования value for 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))))))))) at 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 $ Извлечение $$ build $ 1 (Extraction.scala: 317) at net.liftweb.json.Extraction $$ anonfun $ 14.apply (Extraction.scala: 253) at net.liftweb.json. Экстракция $$ anonfun $ 14.apply (Extraction.scala: 253) at 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 $ Извлечение $$ build $ 1 (Extraction.scala: 315) at net.liftweb.json.Extraction $ .net $ liftweb $ json $ Экстракция $$ extract0 (Extraction.scala: 366) at net.liftweb.json.Extraction $ .net $ liftweb $ json $ Экстракция $$ extract0 (Добыча.scala: 199) at net.liftweb.json.Extraction $ .extract (Добыча. scala: 43) at net.liftweb.json.JsonAST $ JValue.extract (JsonAST.scala: 312) at net.liftweb.json.Serialization $ .read (Serialization.scala: 58) at Что мне делать?

ответ

1

Поле для вашего_общества определено как scala.collection.mutable.Map. Серийная сериализация JSON для лифтов знает, как сериализовать карту (изменяемую или неизменяемую), но она не знает, как десериализоваться в изменчивой карте. Чтобы исправить это, определите свою карту как scala.collection.immutable.Map или добавьте TypeHints в свои форматы, чтобы поддерживать изменяемый тип.

+0

конвертировать в неизменяемую карту сделал трюк, спасибо! – nitin