【问题标题】:JSON Rendering Scala/Play 2.1JSON 渲染 Scala/Play 2.1
【发布时间】:2013-02-15 22:47:35
【问题描述】:

我正在做一个小项目,尝试让 Scala/Play 后端正常工作。我试图让它返回并在 Web 服务端处理 JSON。我似乎无法弄清楚如何让 JSON 编组和解组工作。有人可以帮我解决这个问题吗?我正在使用 Play 2.1 和 Scala 2.10。我得到的错误是 “重写方法读取 trait Reads of type (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)
    ))
    }
    }
    

【问题讨论】:

    标签: scala playframework playframework-2.1


    【解决方案1】:

    使用 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

    【讨论】:

      【解决方案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]
      

      More details on this technique 在 Play 官方文档中。

      【讨论】:

        【解决方案3】:

        嘿,我的解决方案是:

        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
                       )
        

        总之,你得到一个伴生对象。该配置将案例类的所有键转换为蛇形。隐式值确保可以将有效的 Json 解析为模型。所以你得到你的测试模型。

        Json 应该如下所示:

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

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

        【讨论】:

        • 哦,我没有意识到您使用的是 play 2.1,它可能无法正常工作,我很抱歉。我使用的是 2.6,它非常简单
        猜你喜欢
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多