我有一堂看起来像这样的课
import java.time.OffsetDateTime
import spray.json._
import DefaultJsonProtocol._
sealed trait Person {
def firstName: String
def country: String
def lastName: String
def salary: Option[BigDecimal]
}
case class InternalPerson(
firstName: String,
country: String,
lastName: Option[BigDecimal],
salary: Option[BigDecimal]
) extends Person
object Person {
def fromName(name: Name, country: String, salary: Option[BigDecimal]): Person = {
InternalPerson(
firstName = name.firstName,
lastName = name.lastName,
country = country,
salary = salary
)
}
}
object PersonJsonProtocol extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat4(Person.apply)
}
我只是想向我的班级添加json支持。每当我导入协议和来自其他类的spray.json._
时,我都会得到:
Note: implicit value personFormat is not applicable here because it comes after the application point and it lacks an explicit result type
和
value apply is not a member of object of Person
关于如何让Json支持在scala中扩展特征的伴侣对象的任何想法?
答案 0 :(得分:1)
如果您根据案例类InternalPerson定义了隐式,则应启用json格式:implicit val personFormat = jsonFormat4(InternalPerson)
您将不必定义apply()方法,否则必须在Person特质或其任何实现中进行此操作。
答案 1 :(得分:0)
您可以使用play框架来处理Json。
https://www.playframework.com/documentation/2.6.x/ScalaJson
我认为这非常简单直观。
对于基本类型,使用Json.format[ClassName]
就足够了。如果您有更复杂的东西,可以编写自己的writes
和reads
。我知道这个问题与喷雾有关,但是另一种解决方案可能很好。
因此,例如InternalPerson
将是:
import play.api.libs.json.Json
case class InternalPerson {
firstName: String,
country: String,
lastName: Option[BigDecimal],
salary: Option[BigDecimal]
)
object InternalPerson {
implicit val format = Json.format[InternalPerson]
}
如果要使用Trait
进行操作,则将是相同的。有时您需要显式地编写读写操作。