Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为traits播放2.1 Json序列化?_Json_Scala_Playframework_Playframework 2.1 - Fatal编程技术网

为traits播放2.1 Json序列化?

为traits播放2.1 Json序列化?,json,scala,playframework,playframework-2.1,Json,Scala,Playframework,Playframework 2.1,我有这个: package models import play.api.libs.json._ import play.api.libs.functional.syntax._ object ModelWrites { implicit val tmoWrites= Json.writes[TestModelObject] implicit val ihWrites = Json.writes[IntHolder] } case class TestModelObject

我有这个:

package models

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

object ModelWrites {
    implicit val tmoWrites= Json.writes[TestModelObject]
    implicit val ihWrites = Json.writes[IntHolder]
}

case class TestModelObject(s1:String, s2:String)

case class IntHolder(i1:Int, i2:Int)

trait HasInts {
    val ints: List[IntHolder]
}
当我这样做时:

scala> val tmo = new TestModelObject("hello", "world") with HasInts {
  val ints = List(IntHolder(1,2), IntHolder(3,4))
}

scala> Json.toJson(tmo)
res0: play.api.libs.json.JsValue = {"s1":"hello","s2":"world"}
如何隐式序列化混合值“ints”?比如:

scala> val someInts = List(IntHolder(8,9), IntHolder(10,11))
someInts: List[models.IntHolder] = List(IntHolder(8,9), IntHolder(10,11))

scala> Json.toJson(someInts)
res1: play.api.libs.json.JsValue = [{"i1":8,"i2":9},{"i1":10,"i2":11}]
注意:如果我尝试:
implicit val hasIntsWrites=Json.writes[HasInts]
I(预期?)得到:


您不能在这里直接使用(
Json.writes[…]
),因为这只适用于case类。然而,您可以在Inception提供的
Writes
实例的基础上构建,只需一个非常小的样板就可以完成您想要的任务

请注意,我忽略了这样一个问题,即在实例化一个case类时,将trait混合在一起是否是一个好主意—可能不是—但我在这里给出的方法也适用于更一般的情况

首先是类和导入(此处无更改):

现在我们需要将所有低优先级实例放入trait中,以确保编译器选择正确的实例,因为带有HasInts的
TestModelObject
TestModelObject
HasInts
的子类型:

trait LowPriorityWritesInstances {
  implicit val tmoWrites = Json.writes[TestModelObject]
  implicit val ihWrites = Json.writes[IntHolder]

  implicit object hiWrites extends OWrites[HasInts] {
    def writes(hi: HasInts) = Json.obj("ints" -> hi.ints)
  }
}
现在的主要活动是:

object WritesInstances extends LowPriorityWritesInstances {
  implicit val tmowhiWrites = new Writes[TestModelObject with HasInts] {
    def writes(o: TestModelObject with HasInts) =
      tmoWrites.writes(o) ++ implicitly[OWrites[HasInts]].writes(o)
  }
}
我们完成了:

scala> import WritesInstances._
import WritesInstances._

scala> val tmo = new TestModelObject("hello", "world") with HasInts {
     |   val ints = List(IntHolder(1, 2), IntHolder(3, 4))
     | }

scala> println(Json.toJson(tmo))
{"s1":"hello","s2":"world","ints":[{"i1":1,"i2":2},{"i1":3,"i2":4}]}

根据需要。

棒极了。正是我想要的。谢谢!请注意,我忽略了这样一个问题,即在实例化一个case类时,将trait混入其中是否是一个好主意这可能不是“我洗耳恭听,如果你愿意解释的话:),现在我在猜测我自己。“案例到案例”继承很长一段时间以来一直被禁止,并且在2.10中被禁止,但是您在这里所做的(匿名从案例类继承)可能不会导致任何相同的问题。所以你可以忽略这一点。当我有几分钟的时间来检查更多细节时,我会尝试更新答案。
object WritesInstances extends LowPriorityWritesInstances {
  implicit val tmowhiWrites = new Writes[TestModelObject with HasInts] {
    def writes(o: TestModelObject with HasInts) =
      tmoWrites.writes(o) ++ implicitly[OWrites[HasInts]].writes(o)
  }
}
scala> import WritesInstances._
import WritesInstances._

scala> val tmo = new TestModelObject("hello", "world") with HasInts {
     |   val ints = List(IntHolder(1, 2), IntHolder(3, 4))
     | }

scala> println(Json.toJson(tmo))
{"s1":"hello","s2":"world","ints":[{"i1":1,"i2":2},{"i1":3,"i2":4}]}