在PlayFramework的Json库中,Writes[-A]和OWrites[-A]有什么区别?我已经使用过Writes[A],但是我无法弄清楚OWrites的目的。同样的问题也适用于Format[A] vs OFormat[A]。
可以在这里的Writes和这里的Formats找到源代码。我已经查看了它们,但我无法弄清楚它们在使用上的区别。
可以在这里的Writes和这里的Formats找到源代码。我已经查看了它们,但我无法弄清楚它们在使用上的区别。
class Foo(val name: String, val age: Long)
Writes
实例: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> val json = fooWrites.writes(new Foo("McBar", 101))
json: play.api.libs.json.JsValue = {"name":"McBar","age":101}
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
^
implicit val fooWrites: OWrites[Foo] = (
(__ \ 'name').write[String] and (__ \ 'age').write[Long]
)(foo => (foo.name, foo.age))
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)
writes
在 OWrites
上的输出被静态类型化为 JsObject
,因此我们可以使用 .keys
而不需要不安全的 as[JsObject]
转换。
OWriter
是否比普通的Writer
提供更多/不同的功能。我认为@Travis所说的“更具体的返回类型”是指OWrites[T] extends Writes[T]
,其中Writest[T] def writes(in: T): JsValue
,而OWrites[T]
中相同的方法是def writes(in: T): JsObject
,其中JsObject
是JsValue
的子类。 - goralimplicitly[OWrites[Foo]].writes(foo)
之外,还有其他方法可以访问隐式的OWrites
吗?Json.toJson(foo)
可以找到一个隐式的Writes
,但如果你的隐式是一个OWrites
,它会将其视为一个Writes
并将输出作为JsValue
处理。 - emote_control