2015-02-04 8 views
0

У меня есть класс случае определяется следующим образом:Определение сценариев для класса case, который содержит свойство, тип которого является Map. Json/Scala/PlayFramework

scala> import play.api.libs.json._ 
    import play.api.libs.json._ 
scala> import play.api.libs.functional.syntax._ 
    import play.api.libs.functional.syntax._ 

scala> type MapIntString = Map[Int, String] 
    defined type alias MapIntString 

case class Duh(a: MapIntString) 
    defined class Duh 

Когда я попытался объявить его Записывает таким образом, я получил сообщение об ошибке:

scala> implicit val duhWrites = Json.writes[Duh] 
    <console>:25: error: No implicit Writes for MapIntString available. 
    implicit val duhWrites = Json.writes[Duh] 

Так что я прибегаю к этому. .., все еще получена ошибка:

scala> implicit val duhWrites: Writes[Duh] = (
    | (JsPath \ "a").write[MapIntString] 
    |)(unlift(Duh.unapply _)) 
    <console>:26: error: overloaded method value write with alternatives: 
    (t: MapIntString)(implicit w: play.api.libs.json.Writes[MapIntString])play.api.libs.json.OWrites[play.api.libs.json.JsValue] <and> 
    (implicit w: play.api.libs.json.Writes[MapIntString])play.api.libs.json.OWrites[MapIntString] 
    cannot be applied to (Duh => MapIntString) 
    (JsPath \ "a").write[MapIntString] 

Может ли кто-нибудь помочь мне указать, где я ошибся?

Я чувствую, что мое понимание этого читает/пишет комбинаторы немного шатким. Я разместил связанный с этим вопрос (когда я пытался понять, что происходит): What is this "and" in ScalaJsonCombinator (when defining a Writes)?

Если вы знаете, как лучше всего использовать Writes и Reads для «Duh», поделитесь им.

Заранее благодарен!

ответ

2

Нет предопределенных Writes для Map[Int, String], только Map[String, A]. Это связано с тем, что все ключи JSON должны быть String, а клавиши Int действительно не имеют никакого смысла. Вы можете исправить это, указав тот, который преобразует ключи Int в String.

type MapIntString = Map[Int, String] 

implicit val mapIntWrites = new Writes[MapIntString] { 
    def writes(m: MapIntString): JsValue = 
     Json.toJson(m.map { case (k, v) => (k.toString, v)}) 
} 

scala> implicit val duhWrites = Json.writes[Duh] 
duhWrites: play.api.libs.json.OWrites[Duh] = [email protected] 
+0

Thanks! ты спас мой день. –

 Смежные вопросы

  • Нет связанных вопросов^_^