Формат JSON Play Framework для объектов Case

У меня есть набор объектов case, которые наследуются от черты, как показано ниже:

  sealed trait UserRole
  case object SuperAdmin extends UserRole
  case object Admin extends UserRole
  case object User extends UserRole

Я хочу сериализовать это как JSON, и я просто использовал механизм форматирования:

implicit val userRoleFormat: Format[UserRole] = Json.format[UserRole]

Но, к сожалению, компилятор недоволен и говорит:

No unapply or unapplySeq function found

Что не так в моем случае с объектами?


person joesan    schedule 27.01.2017    source источник


Ответы (2)


Другой вариант - override def toString вот так:

Файл: Status.scala

    package models

    trait Status
    case object Active extends Status {
      override def toString: String = this.productPrefix
    }
    case object InActive extends Status {
      override def toString: String = this.productPrefix
    }

this.productPrefix предоставит вам имя объекта case

Файл: Answer.scala

package models

import play.api.libs.json._

case class Answer(
    id: Int,
    label: String,
    status: Status
) {
  implicit val answerWrites = new Writes[Answer] {
    def writes(answer: Answer): JsObject = Json.obj(
      "id" -> answer.id,
      "label" -> answer.label,
      "status" -> answer.status.toString
    )
  }
  def toJson = {
    Json.toJson(this)
  }
}

Файл: Controller.scala

import models._
val jsonAnswer = Answer(1, "Blue", Active).toJson
println(jsonAnswer)

ты получаешь:

{"id":1,"label":"Blue","status":"Active"}

Надеюсь это поможет!

person kuba86    schedule 22.11.2018

Хорошо, я понял, что нужно делать!

Вот:

  implicit object UserRoleWrites extends Writes[UserRole] {
    def writes(role: UserRole) = role match {
      case Admin => Json.toJson("Admin")
      case SuperAdmin => Json.toJson("SuperAdmin")
      case User => Json.toJson("User")
    }
  }
person joesan    schedule 27.01.2017
comment
Дело не в объекте case, а в запечатанном типе / семействе, которое не поддерживается макросом в последней версии, но появится в следующем: github.com/playframework/play-json/pull/16 - person cchantep; 27.01.2017
comment
Этот запрос на перенос решает проблему для классов case, но не для объектов case - person gcaliari; 09.06.2017