Json Play Framework 2.4写入[-A]与OWrites[-A],格式[A]与格式[A]。目的?

Json Play Framework 2.4写入[-A]与OWrites[-A],格式[A]与格式[A]。目的?,json,scala,playframework-2.4,Json,Scala,Playframework 2.4,PlayFramework Json库中写入[-A]和OWrites[-A]之间有什么区别?我用过书面语,但我不知道写书面语的目的是什么。同样的问题也适用于格式[A]和格式[A] 可以找到源代码并进行修改。我已经看过了它们,但我无法找出它们在用法上的区别。通常您知道编码器总是会生成JSON对象(而不是任意JSON值)。在类型系统中跟踪这一事实,可以使用这种编码器的输出,而无需跳过通常需要的环 例如,假设我们有一个简单的类: class Foo(val name: String, val age:

PlayFramework Json库中写入[-A]和OWrites[-A]之间有什么区别?我用过书面语,但我不知道写书面语的目的是什么。同样的问题也适用于格式[A]和格式[A]


可以找到源代码并进行修改。我已经看过了它们,但我无法找出它们在用法上的区别。

通常您知道编码器总是会生成JSON对象(而不是任意JSON值)。在类型系统中跟踪这一事实,可以使用这种编码器的输出,而无需跳过通常需要的环

例如,假设我们有一个简单的类:

class Foo(val name: String, val age: Long)
我们编写一个
编写的
实例如下:

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

implicit val fooWrites: Writes[Foo] = (
  (__ \ 'name).write[String] and (__ \ 'age).write[Long]
)(foo => (foo.name, foo.age))
scala> json.as[JsObject].keys
res0: scala.collection.Set[String] = Set(name, age)
现在我们可以写以下内容:

scala> val json = fooWrites.writes(new Foo("McBar", 101))
json: play.api.libs.json.JsValue = {"name":"McBar","age":101}
现在假设出于任何原因,我们想要得到一个字段名列表。我们必须这样写:

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

implicit val fooWrites: Writes[Foo] = (
  (__ \ 'name).write[String] and (__ \ 'age).write[Long]
)(foo => (foo.name, foo.age))
scala> json.as[JsObject].keys
res0: scala.collection.Set[String] = Set(name, age)
与此相反:

scala> json.keys
<console>:17: error: value keys is not a member of play.api.libs.json.JsValue
              json.keys
                   ^
然后:

scala> val json = fooWrites.writes(new Foo("McBar", 101))
json: play.api.libs.json.JsObject = {"name":"McBar","age":101}

scala> json.keys
res1: scala.collection.Set[String] = Set(name, age)
OWrites
上的
writes
的输出静态键入为
JsObject
,因此我们可以使用
.keys
而不使用不安全的
作为[JsObject]
强制转换


(顺便说一句,我想让方法返回类型在子类中更加具体,我已经在中解决了这个问题。)

所以,您的意思是,如果我知道某个对象是Json对象(而不是Json数组),那么最好实现OWrites而不是write,对吗?关于“非个人粉丝”中的链接,我在任何地方都找不到“更具体的返回类型”。。我想不起来。请你进一步解释一下你所联系的问题好吗?感谢OWrites的解释:)如果您的用例需要,更可取。我不知道
OWriter
是否比普通
Writer
提供了更多/不同的功能,除了编译时知道它是一个JsObject之外。我认为@Travis所说的“更具体的返回类型”是指
OWrites[T]扩展写入[T]
其中
Writest[T]
def写入(in:T):JsValue
,而
OWrites[T]
中的相同方法是
def写入(in:T):JsObject
其中
JsObject
JsValue
的子类@goral是的,我在Writes vs OWrites的例子中领会到了这个想法,但我不明白的是这里发生了什么:在写这篇文章的时候,似乎都不像Travis。除了
隐式[OWrites[Foo]]之外,还有什么别的吗。Writes(Foo)
允许您访问隐式的
OWrites
Json.toJson(foo)
查找隐式
写入
,但如果您的隐式是
OWrites
,它将其视为写入,并将输出视为JsValue。