簡體   English   中英

播放json將缺少的字段解析為空數組

[英]Play json parse missing field as empty array

使用play-json 2.3我該如何解析

{i: 0}

進入這個

case class A(i: Int, s: Seq[Int])

我非常想重用Json.format宏

此刻它給我“缺少路徑s”

UPD:我最終寫了一個自定義格式並將其拉皮到JsPath上:

implicit class JsPathExtensions(path: JsPath) {
  //return mzero if the path is missing
  def lazyFormatNullableM[T: Monoid](f: => Format[T]): OFormat[T] = OFormat(path.lazyReadNullable(f).map(_.orZero), new OWrites[T] {
    override def writes(o: T) = path.lazyWriteNullable(f).writes(o.some)
  })
}

如果缺少路徑,則在不更改類的情況下我看不到任何利用宏的方法。 在這種情況下,您可以使用json組合器定義Reads並將宏用於Writes

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

implicit val reads: Reads[A] = (
    (__ \ "i").read[Int] and 
    (__ \ "s").read[Seq[Int]].orElse(Reads.pure(Nil))
)(A.apply _)

implicit val writes: Writes[A] = Json.writes[A]

json宏僅涵蓋了非常有限的用例范圍,不可避免地會遇到必須編寫自己的ReadsWrites

利用Json.format[A]宏的最簡單方法是稍微更改A的定義:

case class A(i: Int, s: Option[Seq[Int]])

Option的用法非常清楚,您可以在其上map並做很多好事,但是如果您真的想將s視為一個空集合,則可以進一步增強case類:

case class Foo(i: Int, s: Option[Seq[Int]]) {
  lazy val theSeq:Seq[Int] = s.getOrElse(Seq[Int]())
}

現在,如果您訪問theSeq ,則省略s傳入JSON和為s提供空數組的JSON絕對沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM