JSON渲染Scala / Play 2.1

时间:2013-02-15 22:47:36

标签: scala playframework playframework-2.1

我正在开发一个小项目,尝试让Scala / Play后端正常工作。我试图让它返回并在Web服务端处理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)
    ))
    }
    }
    

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以使用宏进一步简化代码,尽管它们被标记为实验性的:

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文档中的

More details on this technique

答案 2 :(得分:0)

嘿,我的解决方案是:

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
               )

总之,你会得到一个补偿对象。配置将案例类的所有键转换为snakecase。隐式值确保可以将有效的Json解析为模型。所以你得到了你的测试模型。

Json应该是这样的:

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

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