Я генерирую JSON для скорости, где единиц может отличаться. У меня есть черта SpeedUnit и классы, которые расширяют ее (узлы, метрыPerSecond, MilesPerHour). JSON Play documentation сказал: «Чтобы преобразовать ваши собственные модели в JsValues, вы должны определить неявные Writes-конвертеры и предоставить их в области видимости». Я получил это, чтобы работать в большинстве мест, но не тогда, когда у меня был класс, расширяющий черту. Что я делаю не так? Или есть вариант Enum, который я мог или должен был использовать вместо этого?Получение JSON JsValueWrapper для класса, который расширяет черту
// Type mismatch: found (String, SpeedUnit), required (String, Json.JsValueWrapper)
// at 4th line from bottom: "speedunit" -> unit
import play.api.libs.json._
trait SpeedUnit {
// I added this to SpeedUnit thinking it might help, but it didn't.
implicit val speedUnitWrites = new Writes[SpeedUnit] {
def writes(x: SpeedUnit) = Json.toJson("UnspecifiedSpeedUnit")
}
}
class Knots extends SpeedUnit {
implicit val knotsWrites = new Writes[Knots] {
def writes(x: Knots) = Json.toJson("KT")
}
}
class MetersPerSecond extends SpeedUnit {
implicit val metersPerSecondWrites = new Writes[MetersPerSecond] {
def writes(x: MetersPerSecond) = Json.toJson("MPS")
}
}
class MilesPerHour extends SpeedUnit {
implicit val milesPerHourWrites = new Writes[MilesPerHour] {
def writes(x: MilesPerHour) = Json.toJson("MPH")
}
}
// ...
class Speed(val value: Int, val unit: SpeedUnit) {
implicit val speedWrites = new Writes[Speed] {
def writes(x: Speed) = Json.obj(
"value" -> value,
"speedUnit" -> unit // THIS LINE DOES NOT TYPE-CHECK
)
}
}
Большое спасибо @TravisBrown, это выглядит действительно здорово. Мне нравятся функциональные подходы. Оба ваших решения выглядят неплохо. Если они сработают, я вернусь и приму этот ответ. – gknauth
Это действительно работало @TravisBrown. Опять же, это был прекрасный ответ, очень полезный и образовательный. – gknauth