当 table 字段在 Slick Play 中为 Null 时保持 JSON 输出一致

Keep JSON output consistent when table field is Null in Slick Play

我试图不将 Scala 中的每个字段标记为 Option:

to_date: LocalDateTime

但它给出 Compilation Error:

 type mismatch;
 found   : None.type
 required: java.time.LocalDateTime

通过使用 Option 错误消失了:

to_date: Option[LocalDateTime]

但我遇到了另一个问题,to_date 字段已从 JSON 响应中删除:

UserModel.find(UserId).map {
    case Some(x) => Ok(Json.toJson(x)(userWrites))
    case None => NotFound("user not found!")
} 

如何在使用 Slick 时在 Scala Play framework 的 JSON 响应中保留 to_date 字段?

您可以使用 OptionHandlers(和 JsonNaming)进行自定义 JsonConfiguration

import play.api.libs.json._

import java.time.LocalDateTime

case class Foo(toDate: Option[LocalDateTime])

object Foo {
  implicit val writes: OWrites[Foo] = {
    implicit def config = JsonConfiguration(
      naming = JsonNaming.SnakeCase,
      optionHandlers = OptionHandlers.WritesNull)

    Json.writes[Foo]
  }
}

Json.toJson(Foo(Some(LocalDateTime.now())))
// {"to_date":"2020-01-27T10:08:55.742106"}

Json.toJson(Foo(None))
// {"to_date":null}