gpt4 book ai didi

scala - 在 Play Scala 中实现 Pk Writes 的通用方法

转载 作者:行者123 更新时间:2023-12-02 02:00:47 26 4
gpt4 key购买 nike

我正在尝试编写一种通用方法来处理将 Pk 类写入 Play 2.1 中的 JSON,因为我认为为每个 Pk< 编写一个单独的类是一种浪费 您正在使用的类型。这是我到目前为止所拥有的:

implicit def pkWrites[E] = new Writes[Pk[E]] {
def writes(pk: Pk[E]): JsValue = Json.toJson(pk.get)
}

...我在这样的代码中使用它:

Json.toJson(Id(42L))

现在,这种方法有效(Scala 找到了),但这是我得到的错误:

No Json deserializer found for type E. 
Try to implement an implicit Writes or Format for this type.

其中类型 ELong(因此,有一个反序列化器)。无论如何我可以告诉 Json.toJson E 是什么类型?

最佳答案

您唯一需要做的就是确保范围内有类型 E 的反序列化器,因为现在您无法确定您使用的每种类型都是可写的。你可以试试看:

class Value[A](value: A){
def get[A] = value
}

implicit def valueWrites[E](implicit longWrites: Writes[E]) = new Writes[Value[E]]{
def writes(value: Value[E]): JsValue = Json.toJson(value.get)
}

Json.toJson(new Value(5L))

您可以将隐式方法缩短为:

implicit def valueToJson[E: Writes] = new Writes[Value[E]]{
def writes(value: Value[E]): JsValue = Json.toJson(value.get)
}

编辑:

上面这两个方法完全一样,这意味着方法需要隐式值,在你的例子中是Pk[Long],所以这个方法知道如何反序列化数字。换句话说,E: Writes 告诉方法:搜索类型Writes[E] 的隐式值。

编辑 2:

Json.toJson(1) 有效,因为范围内有 Writes[Int]。同理valueWrites[Int],作用域中有Writes[Int],所以方法可以使用Writes[Int]反序列化字段 value 并因此反序列化整个类。

关于scala - 在 Play Scala 中实现 Pk Writes 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17305384/

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