2015-02-23 4 views
5

Sto cercando di scrivere un JSON legge combinatore per il tipo di mappa [Int, Long]Come scrivere un JSON Legge Combinator per una mappa [Int, Long]

ho questo finora:

implicit val mapWrites = Json.writes[Map[Int, Long]] 

implicit val mapReads: Reads[Map[Int, Long]] = (
    // ??? 
) // ? 

io non sono sicuro di come questo lavoro, ho provato a fare (Map [Int, Long] .Applicare ma che applicare il metodo non era disponibile.

ricerca di qualche aiuto per scrivere questo Legge combinatore.

risposta

8

Questo dovrebbe farlo, con il caveat tha t non gestisce NumberFormatException nel caso reads:

// 
// scala> Json.toJson(Map(1 -> 2L, 2 -> 3L)) 
// res0: play.api.libs.json.JsValue = {"1":2,"2":3} 
// 
implicit val formatter: Format[Map[Int, Long]] = { 
    new Format[Map[Int, Long]] { 
    def writes(m: Map[Int, Long]) = { 
     Json.toJson(m.map { 
     case (key, value) => key.toString -> value 
     }) 
    } 

    def reads(json: JsValue) = { 
     json.validate[Map[String, Long]].map(_.map { 
     case (key, value) => key.toInt -> value 
     }) 
    } 
    } 
} 

come separato Reads e Writes casi:

implicit val readsInstance: Reads[Map[Int, Long]] = { 
    new Reads[Map[Int, Long]] { 
    def reads(json: JsValue) = { 
     json.validate[Map[String, Long]].map(_.map { 
     case (key, value) => key.toInt -> value 
     }) 
    } 
    } 
} 

implicit val writesInstance: Writes[Map[Int, Long]] = { 
    def writes(m: Map[Int, Long]) = { 
     Json.toJson(m.map { 
     case (key, value) => key.toString -> value 
     }) 
    } 
    } 
} 
+0

Come funziona questo formato differisce da quello che ho fatto in precedenza? Lo snippet di codice può essere scritto come 2 letture e scritture implicite separate? – Blankman

+1

@Blankman 'Format' è solo' Reads' e 'Writes', quindi puoi dividerlo in due, se è la tua preferenza, ma tendo ad usare' Format' quando ho bisogno di implementare entrambi i tratti. https://github.com/playframework/playframework/blob/df5a65fb426ae9d10052cfeacfb7a3c1080285c9/framework/src/play-json/src/main/scala/play/api/libs/json/Format.scala#L13 –

+0

Puoi per favore dividere le letture uno per me sotto il tuo codice, voglio solo vederlo separato anche per imparare qualcosa. Sono un po 'bloccato, grazie! – Blankman