JSON支持伴随对象

时间:2018-10-02 17:27:31

标签: json scala spray

我有一堂看起来像这样的课

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中扩展特征的伴侣对象的任何想法?

2 个答案:

答案 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]就足够了。如果您有更复杂的东西,可以编写自己的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进行操作,则将是相同的。有时您需要显式地编写读写操作。