【问题标题】:Play framework - pass parameter to Writes and Reads播放框架 - 将参数传递给写入和读取
【发布时间】:2015-12-16 17:57:08
【问题描述】:

有没有办法将参数传递到 Writes 中,我将能够控制 JsValue 的写入方式?

这就是现在的样子:

implicit val myClassWrites = new Writes[MyClass] {
    override def writes(l: MyClass): JsValue = Json.obj("a" -> l.a, "b" -> l.b)
}

但我想做这样的事情:

implicit val myClassWrites = new Writes[MyClass] (extended: Option[Boolean]) {
    override def writes(l: MyClass): JsValue = {
          extended match{
             case true => //do something
             case false => //do something else
          }
    }
}

有没有一种优雅的方式来实现这一点?或类似的东西?

我设法用这样的读物来实现这个需求(删除隐式):

def myClassReads(c: String) : Reads[MyClass] = (
  Reads.pure(c) and
  (JsPath \ "a").read[String] and
  (JsPath \ "b").read[String]
) (MyClass.apply _)

然后当我想使用读取时(通常在我想验证请求正文时在控制器中)我这样做:

request.body.validate[MyClass](MyClass.myClassReads("foo")).fold(
    errors => //
    myClass=> // do domething
)

因此,Writes 仍然是一个谜。

【问题讨论】:

    标签: json scala playframework-2.0


    【解决方案1】:

    您可以使用implicit 参数执行此操作。见以下代码:

    case class Extended(b: Boolean)
    
    object MyClass {
    
     implicit def MyClassWrites(implicit extended: Extended): Writes[MyClass] = new Writes[MyClass] {
         def writes(l: MyClass) =
              if (extended.b) JsString("foo")
              else JsString("bar")
        }
    }
    

    然后像这样使用

    implicit var extd = Extended(true)
    
    println(Json.toJson(myClass)) // foo
    
    extd = Extended(false)
    
    println(Json.toJson(myClass)) // bar
    

    【讨论】:

    • 在我看来,使用隐式来配置行为是他们在 Scala 中名声不佳的重要原因。每个人都这样做,但 I wish we would do it a little less — 尤其是在这种情况下,跟踪调用站点并找到范围内的隐式可能会非常烦人。
    • 谢谢!使用隐式参数确实可以解决我的问题,但我同意@TravisBrown,我不喜欢在这种情况下使用隐式参数,过了一段时间,我从哪里得到这个神奇的参数变得非常神秘。还有其他想法吗?
    • 我不知道您将如何使用Writes,但如果使用方法Json.toJson(o: T)(tjs: Writes[T]),您可以将Writes 定义为def myClassWrites(extended: Boolean): Writes[MyClass] = .... 之类的方法并使用Json.toJson(myClass)(myClassWrites(true /*false*/)) (或直接myClassWrites(true).writes(myClass))。我了解您的Reads 用法,但您将如何使用Writes
    • 这正是我所做的@MrRontgen
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2012-06-24
    相关资源
    最近更新 更多