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]
就足够了。如果您有更复杂的东西,您可以编写自己的 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
来做,那也是一样的。有时您需要显式写入读写。
我有一个 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]
就足够了。如果您有更复杂的东西,您可以编写自己的 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
来做,那也是一样的。有时您需要显式写入读写。