Scala 当我的case类上有Option[Instant]属性时,我的JSON读取没有编译

Scala 当我的case类上有Option[Instant]属性时,我的JSON读取没有编译,scala,play-json,Scala,Play Json,如何为具有option Instant属性的类编写json读取 case class User(id: Int, joined: Option[Instant]) 我的IDE显示错误: 未找到参数的隐式:读取[Option[Instant]] 如果我删除该选项,那么即时操作就可以了 为什么它暂时不允许选项?在这种情况下,您不应该尝试解析选项[t],而是使用可读取的 import java.time.Instant case class User(id: Int, joined: Option

如何为具有option Instant属性的类编写json读取

case class User(id: Int, joined: Option[Instant])
我的IDE显示错误:

未找到参数的隐式:读取[Option[Instant]]

如果我删除该选项,那么即时操作就可以了


为什么它暂时不允许选项?

在这种情况下,您不应该尝试解析
选项[t]
,而是使用
可读取的

import java.time.Instant

case class User(id: Int, joined: Option[Instant])

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

implicit val userReads: Reads[User] = (
  (__ \ "id").read[Int] and 
  (__ \ "joined").readNullable[Instant]
 )(User.apply _)
此外,在这种情况下,使用提供的宏更容易:

import java.time.Instant

case class User(id: Int, joined: Option[Instant])

import play.api.libs.json._

implicit val userReads: Reads[User] = Json.reads[User]

如果您有时间,您能解释一下为什么选项[T]不起作用吗?一般来说,选项是一种特殊情况,因为它可以根据上下文以不同的方式编码(null,省略,…),并且它是为任何
T:Reads
派生的。所以在JSON中,要使即时值无JSON必须包含什么?null或省略,请尝试
import java.time.Instant

case class User(id: Int, joined: Option[Instant])

import play.api.libs.json._

implicit val userReads: Reads[User] = Json.reads[User]