我正在编写一个简单的json序列化处理器,用于 java.io.File
只是刺激路径:
import java.io.File
import play.api.libs.json._
import Implicits.File._
object Implicits {
object File {
implicit val format: Format[File] = new Format[File] {
override def writes(o: File): JsValue = JsString(o.toString)
override def reads(js: JsValue): JsResult[File] = js.validate[String].map(f => new File(f))
}
}
}
final case class Bar(path: File)
object Bar {
implicit val format: Format[Bar] = Json.format
}
我发现上述不起作用:
No instance of play.api.libs.json.Format is available for java.io.File in the implicit scope
但是,如果我将Implicit.File.format
的名称更改为Implicit.File.fmt
,则可以正常工作。
为什么在这种情况下,该名称在这种情况下应为 type , Format[File]
,隐式范围解析器应该关心?
我正在使用play-json 2.6.7。
为什么在这种情况下,该名称在这种情况下应为
Format[File]
的类型,即隐式示波器解析器应该关心?
因为它也确实在乎该名称。
有资格传递给T型隐式参数的实际参数分为两类。首先,符合条件是所有标识符X,可以在没有前缀的情况下在方法调用的点上访问,这表示隐式定义或隐式参数。因此,合格的标识符可以是本地名称,也可以是封闭模板的成员,也可以通过导入条款前缀在没有前缀的情况下可以访问它。
在implicit val format: Format[Bar] = Json.format
行中,format
表示Bar.format
,而不是Implicits.File.format
,因此Implicits.File.format
不符合此规则的隐式资格。而且它不在伴随对象中,因此第二类也不涵盖。