2015-02-23 26 views
5

bir harita [Int, Uzun] için combinator okur yazma tipi Harita için bağdaştırıcının okur Nasıl [, Int Uzun]bir Json bir json yazmaya çalışıyorum

Bugüne kadar bu var:

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

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

Bunu ben (Map [Int, Uzun] .apply yapıyor çalıştı çalışacaktır ancak bu yöntem mevcut değildi nasıl uygulanacağı emin değilim.

bu bağdaştırıcının okur yazmak için biraz yardım arıyor.

cevap

8

Bunu yapmalı, o reads durumunda NumberFormatException işlemez t: Ayrı Reads ve Writes örneklerini şöyle

// 
// 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 
     }) 
    } 
    } 
} 

:

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

Bu nasıl Biçim yukarıda yaptıklarından ne farkı var? Kod snippet'iniz 2 ayrı okuma olarak yazılabilir Okur ve Yazılır? – Blankman

+1

@Blankman 'Format' sadece 'Reads' ve' Writes', yani ikiye bölebilir, eğer tercihiniz buysa, ama her iki özelliği de uyguladığımda 'Format'ı kullanmaya eğilimliyim. https://github.com/playframework/playframework/blob/df5a65fb426ae9d10052cfeacfb7a3c1080285c9/framework/src/play-json/src/main/scala/play/api/libs/json/Format.scala#L13 –

+0

Okurları ayırabilir misiniz? Benim için kodun altında bir tane, sadece bir şeyler öğrenmek için ayrıldığını görmek istiyorum. Yaptığım için teşekkür ederim. – Blankman