簡體   English   中英

使用play.api.libs.json隱式序列化案例類到Json

[英]Implicit serializing case class to Json with play.api.libs.json

這是我的案例類Response api模型,必須將其轉換為json(Play 2.5):

import play.api.libs.json.{Json, OFormat}

case class ResponseModel(content: NestedCaseClassModel)

object ResponseModel {
  implicit val format: OFormat[ResponseModel] = Json.format
}

case class NestedCaseClassModel(value: String)

object NestedCaseClassModel {
  implicit val format: OFormat[NestedCaseClassModel] = Json.format
}

問題是:當我具有非常深層的嵌套響應結構時,我需要為模型中的每個案例類實現伴侶對象,並添加看起來非常相似的隱式格式

我正在尋找一種允許我一次編寫並將其用於任何case類的機制。 我無法切換表格play.api.libs.json庫。

有什么想法嗎?

好的,我要告訴你如何去做你想做的事,然后我要告訴你為什么你不應該這樣做。

如果要自動為您生成格式,則只需實現一個隱式宏。 我們需要區分要為哪種類型自動生成格式的類型,如果僅將其設置為Any ,那么它將覆蓋諸如String東西,這很不好。 因此,我們將定義一個所有案例類都將實現的特征:

trait ImplicitJsonFormat

現在我們為其實現隱式宏:

import play.api.libs.json._
import scala.language.experimental.macros

trait JsonImplicits {
  // This works for Play 2.5, in Play 2.6 it becomes JsMacroImpl.implicitConfigFormatImpl
  implicit def implicitJsonFormat[A <: ImplicitJsonFormat]: OFormat[A] = macro JsMacroImpl.formatImpl[A]
}

因此,現在要自動生成格式的任何內容, JsonImplicits需要擴展ImplicitJsonFormat ,並確保將隱式格式的任何需要混入JsonImplicits

import play.api.libs.json.{Json, OFormat}

case class ResponseModel(content: NestedCaseClassModel)

object ResponseModel extends JsonImplicits {
  implicit val format: OFormat[ResponseModel] = Json.format
}

case class NestedCaseClassModel(value: String) extends ImplicitJsonFormat

在這里, NestedCaseClassModel會自動生成其格式。 當然,您也可以自動為ResponseModel生成格式。

但是您真的不應該這樣做。 為什么? 有時候,露骨具有價值。 這些json結構不僅僅是不相關的附帶事物。 它們構成了REST API的協議,或您正在使用的任何協議。 通常,這是您想要明確且在整個代碼庫中保持一致的東西。 通過在每種隨播廣告類型上明確定義格式,您可以在這個一致的地方查找格式是什么。 而且,當您需要對其進行自定義時,可以使用手動格式聲明來替換宏,而您對格式的聲明方法沒有做任何更改,答案仍然在於去查看伴隨對象上的格式字段。

當然,當您預先創建項目時,聲明所有這些格式可能會有些乏味。 但這是容易完成,易於正確處理的事情之一,一旦完成就完成了。 隨着代碼庫的發展和進步,無論如何,伴隨對象中都將包含其他內容,並且您將發現需要演化格式,並在遷移代碼庫和協議模式時遠離宏。在不同的方向。

暫無
暫無

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

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