JSON 支持伴随对象

JSON support for companion object

我有一个 class 有点像那个

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)
}

我只是想为我的 class 添加 json 支持。每当我从另一个 classes 导入协议和 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 中扩展特性的伴随对象吗?

如果您根据大小写 class、InternalPerson 定义隐式,则应启用 json 格式:implicit val personFormat = jsonFormat4(InternalPerson)

而且您不必定义 apply() 方法,而您必须在 Person 特征或其任何实现中定义该方法。

可以使用play framework来处理Json。

https://www.playframework.com/documentation/2.6.x/ScalaJson

我认为这非常简单直观。

对于原始类型,使用 Json.format[ClassName] 就足够了。如果您有更复杂的东西,您可以编写自己的 writesreads。我知道这个问题是关于喷雾的,但另一个解决方案可能会很好。

因此,例如 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 来做,那也是一样的。有时您需要显式写入读写。