![](/img/trans.png)
[英]Scala play-json - doesn't parse/deserialize to single argument case class
[英]Scala case has 22 fields but having issue with play-json in scala 2.11.5
我們目前正在使用scala 2.11.5,我班的1個有22個字段。
case class CreateTransactionRequest(name: Option[String],
balance: Option[BigDecimal],
amount: BigDecimal,
currency: String,
dueDate: Option[DateTime],
orderDate: DateTime,
billing: Option[CreateAddressRequest],
shipping: Option[CreateAddressRequest],
status: String,
email: String,
paymentMethod: String,
paymentTerm: Option[String],
deliveryMethod: Option[String],
source: String,
attachments: Option[String],
agent: Option[String],
orders: Option[Set[CreateOrderRequest]],
otherCharges: Option[Seq[CreateTransactionOtherChargeRequest]],
notes: Option[Seq[CreateNoteRequest]],
subscribers: Option[Seq[String]],
trackingId: Option[String],
acquisition: Option[String])
implicit val readsCreateTransactionRequest: Reads[CreateTransactionRequest] = Json.reads[CreateTransactionRequest]
環顧四周后,我遇到了一個解決方案並將其應用
val fields1to12: Reads[(Option[String], Option[BigDecimal], BigDecimal, String, Option[DateTime], DateTime, Option[CreateAddressRequest], Option[CreateAddressRequest], String, String, String, Option[String])] = (
(__ \ "name").read[Option[String]] and
(__ \ "balance").read[Option[BigDecimal]] and
(__ \ "amount").read[BigDecimal] and
(__ \ "currency").read[String] and
(__ \ "dueDate").read[Option[DateTime]] and
(__ \ "orderDate").read[DateTime] and
(__ \ "billing").read[Option[CreateAddressRequest]] and
(__ \ "shipping").read[Option[CreateAddressRequest]] and
(__ \ "status").read[String] and
(__ \ "email").read[String] and
(__ \ "paymentMethod").read[String] and
(__ \ "paymentTerm").read[Option[String]]
).tupled
val fields13to22: Reads[(Option[String], String, Option[String], Option[String], Option[Set[CreateOrderRequest]], Option[Seq[CreateTransactionOtherChargeRequest]], Option[Seq[CreateNoteRequest]], Option[Seq[String]], Option[String], Option[String])] = (
(__ \ "deliveryMethod").read[Option[String]] and
(__ \ "source").read[String] and
(__ \ "attachments").read[Option[String]] and
(__ \ "agent").read[Option[String]] and
(__ \ "orders").read[Option[Set[CreateOrderRequest]]] and
(__ \ "otherCharges").read[Option[Seq[CreateTransactionOtherChargeRequest]]] and
(__ \ "notes").read[Option[Seq[CreateNoteRequest]]] and
(__ \ "subscribers").read[Option[Seq[String]]] and
(__ \ "trackingId").read[Option[String]] and
(__ \ "acquisition").read[Option[String]]
).tupled
implicit val readsCreateTransactionRequest: Reads[CreateTransactionRequest] = (fields1to12, fields13to22) {
case((name, balance, amount, currency, dueDate, orderDate, billing, shipping, status, email, paymentMethod, paymentTerm), (deliveryMethod, source, attachments, agent, orders, otherCharges, notes, subscribers, trackingId, acquisition)) =>
CreateTransactionRequest(name, balance, amount, currency, dueDate, orderDate, billing, shipping, status, email, paymentMethod, paymentTerm, deliveryMethod, source, attachments, agent, orders, otherCharges, notes, subscribers, trackingId, acquisition)
}
我確信我已經按照此鏈接進行嘗試。 不幸的是,它不起作用,我仍然有錯誤
有人可以建議其他方法來在Read
拆分22個字段嗎?
雖然沒有提供完整的代碼,但是我可以在代碼中看到一些問題。 首先,您正在編寫以下代碼:
(__ \ "billing").read[Option[CreateAddressRequest]]
在這里, CreateAddressRequest不是原始類型。 因此,您需要為CreateAddressRequest編寫一個隱式Writes。
然后,案例類的最大字段是可選的。 play無法手動序列化/反序列化可選字段。 因此,您需要具有以下代碼。
implicit def optionFormat[T: Format]: Format[Option[T]] = new Format[Option[T]] {
override def reads(json: JsValue): JsResult[Option[T]] = json.validateOpt[T]
override def writes(o: Option[T]): JsValue = o match {
case Some(t) => implicitly[Writes[T]].writes(t)
case None => JsNull
}
}
而且,播放也無法序列化/反序列化日期字段。 您還需要寫Writes of Date。 下面是java.util.Date Write的示例代碼。
implicit object DateFormat extends Format[java.util.Date] {
val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
def reads(json: JsValue): JsResult[java.util.Date] = JsSuccess(format.parse(json.as[String]))
def writes(date: java.util.Date): JsString = JsString(format.format(date))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.