2015-05-20 62 views
0

我在斯卡拉的自定義數據類型的簡單值:編寫自定義對象JSON作爲斯卡拉(JSON讀取/寫入)

case class GPID(value: Int) { 
    // ... other stuff ... 

    implicit val writesGPID = new Writes[GPID] { 
     def writes(g: GPID): JsValue = { 
      Json.obj(
       "GPID" -> g.value 
      ) 
     } 
    } 

    implicit val reads: Reads[GPID] = (
     (__ \ "GPID").read[Int] 
     ).map(GPID(_)) 
} 

正如你所看到的,它有一個讀/寫的方法,但這種結果在這樣的輸出:

「ID」:{ 「GPID」:1000}

但是,我們只是希望它的序列化/反序列化就像一個普通的詮釋:

「ID」:1000

我一直在試圖找出如何重寫讀/寫,但我運氣不好...任何建議,將不勝感激!

謝謝。

回答

2

我添加了一些驗證,修改您的需求。

object GPID { 
    def unapply(in: Int): Option[GPID] = Option(in).filter(_ > 0).map(apply) 

    implicit val reads = new Reads[GPID] { 
    def reads(in: JsValue) = 
     Option(in) 
     .flatMap { 
      case JsNumber(value) => Some(value) 
      case _ => None 
     } 
     .flatMap(num => unapply(num.toInt)) 
     .map(JsSuccess(_, __)) 
     .getOrElse(JsError(__, "validate.error.expected.GPID")) 
    } 

    implicit val writes = new Writes[GPID] { 
    def writes(g: GPID) = JsNumber(g.value) 
    } 

} 
+0

嗯。更接近,但不完全。它的序列化爲'「id」:{「id」:1000}'所以它仍然把它當作一個對象,而不是一個簡單的值......另外,我不能使用隱式讀取,因爲:'ScalaReflectionException:value apply封裝了多個重載替代品,不能被視爲一種方法。考慮調用<違規符號> .asTerm.alternatives並手動選擇所需的方法。 – Zac

+0

已編輯,立即嘗試。 –

+0

所以你需要提供一個!再次編輯。 –