gpt4 book ai didi

Anorm 的 JSON 反序列化器

转载 作者:行者123 更新时间:2023-12-01 11:45:59 24 4
gpt4 key购买 nike

首先,我是 Play 2 Scala 的新手。我正在尝试将我的模型对象与 JSON 进行转换。

根据此博客 http://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/这是我试过的

    case class Facility(id:Pk[Int],name:String)

object Facility{

implicit val facilityWriter = (
(__ \ "id").write[Pk[Int]] and
(__ \ "name").write[String]
)(unlift(Facility.unapply))

然后它给了我一个错误,说没有找到 Pk[Int] 的 JSON 反序列化器

所以我尝试了这样的事情(在谷歌搜索了一下之后)

implicit object PkFormat extends Format[Pk[Int]] {

def reads(json:JsValue): Pk[Int] = Id(json.as[Int])
def writes(id:Pk[Int]):JsNumber = JsNumber(id.get)
}

我不明白到底发生了什么,无法找到有关如何序列化/反序列化异常的示例。

最佳答案

JSON 序列化器/反序列化器支持 JSON 规范涵盖的所有基本值。如果你想序列化一个自定义类型,你必须告诉序列化器如何去做。

Play 的 JSON 序列化程序使用名为 type class 的 Scala(最初是 Haskell)模式。简而言之,它允许多态性而无需子类化。这是通过在范围内引入隐式值来实现的,即要处理新类型,您可以定义隐式值/方法/对象。在您的具体示例中,您为 Pk[Int] 定义了一个类型类实例。

您可以在代码中手动转换 Pk[Int],或者像许多其他框架一样直接在 Pk 类中实现转换,但是类型类方法更干净(因为 JSON 转换是一个单独的问题)并且更易于重用(现在您可以将 Pk[Int] 转换到任何您想要的位置,即使 Pk 类本身没有如果不支持它,请想象扩展一个闭源系统)。

至于你的代码,它应该可以正常工作,只要确保你在范围内有必要的导入:

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

关于Anorm 的 JSON 反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15351746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com