Рендеринг JSON Scala/Play 2.1

Я работаю над небольшим проектом, пытаясь заставить работать бэкэнд Scala/Play. Я пытаюсь вернуть его, а также обработать JSON на стороне веб-службы. Кажется, я не могу понять, как заставить работать сортировку и десортировку JSON. Может ли кто-нибудь помочь мне с этой проблемой? Я использую Play 2.1 и Scala 2.10. Ошибка, которую я получаю, заключается в том, что «переопределение чтения метода в чтении признаков типа (json: play.api.libs.json.JsValue) play.api.libs.json.JsResult[models.Address]; чтение метода имеет несовместимый тип»

  • Отредактировано. Кто-то еще дал мне решение. Для чтения вы должны использовать JsSuccess, а не JsResult.

    case class Address(id: Long, name: String)
    
    object Address {
    
    implicit object AddressFormat extends Format[Address] {
    def reads(json: JsValue):Address = JsSuccess(Address(
        (json \ "id").as[Long],
        (json \ "name").as[String]
    ))
    
    def writes(address: Address): JsValue = JsObject(Seq(
        "id" -> JsNumber(address.id),
        "name" -> JsString(address.name)
    ))
    }
    }
    

person mbrush    schedule 15.02.2013    source источник


Ответы (3)


С Play 2.1 вы можете упростить свой код:

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val addressFormat = (
  (__ \ "id").format[String] and
  (__ \ "name").format[Long]
)(Address.apply, unlift(Address.unapply))

Более подробную информацию можно найти здесь: ScalaJsonCombinators

person EECOLOR    schedule 16.02.2013

Вы можете еще больше упростить свой код, используя макросы, хотя они помечены как экспериментальные:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Address(id: Long, name: String)

implicit val addressFormat = Json.format[Address]

Подробнее об этом методе в официальной документации Play.

person pjay_    schedule 16.02.2013

Эй, мое решение было бы:

import play.api.libs.json.JsonNaming.SnakeCase
import play.api.libs.json._

object Test {

  implicit val config = JsonConfiguration(SnakeCase)
  implicit val userFormat: OFormat[Test] = Json.format[Test]

}

case class Test(
                 testName: String,
                 testWert: String,
                 testHaus: String
               )

В итоге вы получаете компаньонный объект. Конфиг конвертирует все ключи класса case в снейккейс. Неявные значения гарантируют, что действительный Json может быть преобразован в модель. Так вы получите свою тестовую модель обратно.

Json должен выглядеть так:

{
    "test_name" : "Hello",
    "test_wert": "Hello",
    "test_haus": "Hello"
}

https://www.playframework.com/documentation/2.6.x/ScalaJsonAutomated

person Max Günther    schedule 12.01.2018
comment
О, я не понял, что вы используете play 2.1, это может не сработать, извините. Я использую 2.6, и это довольно просто - person Max Günther; 13.01.2018