從JSON序列化到案例類時,Play的JSON序列化默認爲寬容。例如。如何在Play 2.x中強制執行嚴格的JSON序列化
case class Stuff(name: String, value: Option[Boolean])
implicit val stuffReads: Reads[Stuff] = ( (__ \ 'name).read[String] and (__ \ 'value).readNullable[Boolean] )(Stuff.apply _)
如果下面的JSON收到:
{name: "My Stuff", value: true, extraField: "this shouldn't be here"}
它將以 'JsSuccess' 成功,並丟棄 'extraField'。
有沒有辦法構建Json讀取函數,讓它返回一個JsError如果有'未處理'的字段?
想,如果你今天會做到這一點不同,以增加更多的編譯時間魔法讓'情況class'屬性名稱VS'onlyFields(「名」, 「值」)'可變參數函數? ''onlyFields'方法中的硬編碼屬性名稱工作正常,但遇到維護挑戰時需要記住在'case class'被修改時在'onlyFields'中更新/添加/刪除字段名稱,因爲'onlyFields'沒有編譯時安全性,屬性直到單元測試/運行時。有什麼方法可以在編譯時實現這一點? –
你完全可以用宏來做到這一點,或者更加乾淨利用Shapeless的'LabelledGeneric'。我會盡量找一些時間寫一篇博客文章來做這個'LabelledGeneric',但我不能保證我會在這周得到它。 –