Поддержка JSON для сопутствующего объекта - PullRequest
0 голосов
/ 02 октября 2018

У меня есть класс, который выглядит примерно так:

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 голосов
/ 02 октября 2018

Вы можете использовать игровую среду для работы с 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 это будет то же самое.Иногда вам нужно написать явно читает и пишет.

0 голосов
/ 02 октября 2018

Если вы определили свое неявное в терминах класса case, InternalPerson, должно быть включено форматирование json: implicit val personFormat = jsonFormat4(InternalPerson)

И вам не нужно будет определять метод apply (), который у вас будетпоступать иначе, как с личностным признаком, так и с любой его реализацией.

...