这是什么"和"在ScalaJsonCombinator中(定义Writes时)?

时间:2015-02-04 19:05:22

标签: json scala playframework-2.0 combinators

我一直在使用这个json组合器来处理几个基本/标准情况,却没有真正理解它是如何工作的。一切都很好。

现在我想为任何可能出现的高级病例做好准备;我需要了解代码。

参考:https://www.playframework.com/documentation/2.3.x/ScalaJsonCombinators

我想我能理解阅读:

implicit val locationReads: Reads[Location] = (
  (JsPath \ "lat").read[Double] and
  (JsPath \ "long").read[Double]
)(Location.apply _)

它创建一个Reads:

  1. 首先 - 当给出一个JsValue(通过它的"读取"方法) - 它拉出" lat",然后是" long&#34 ;。在这两个中,它创建了一个元组(Double,Double)。 - https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Reads

  2. 然后将该元组分配给该Reads ...的部分函数,​​在这种情况下是" Location.apply _"返回的内容。我在repl中试过了:

  3. ...

    scala> val yowMan = Location.apply _
    yowMan: (Double, Double) => Location = <function2>
    
    scala> yowMan(1, 2)
    res14: Location = Location(1.0,2.0)
    

    该部分函数将(Double,Double)的元组作为输入。所以......,第1步的结果被引导到第2步,我们得到了一个位置实例作为&#34;读取&#34;的返回。

    现在为写作:

    implicit val locationWrites: Writes[Location] = (
      (JsPath \ "lat").write[Double] and
      (JsPath \ "long").write[Double]
    )(unlift(Location.unapply))
    

    首先&#34; unapply&#34;。我尝试了repl:

    scala> val heyDude = Location.unapply
    <console>:16: error: missing arguments for method unapply in object Location;
    follow this method with `_' if you want to treat it as a partially applied function
       val heyDude = Location.unapply
    

    哎呀,好的,我按照说明操作了:

    scala> val heyDude = Location.unapply _
    heyDude: Location => Option[(Double, Double)] = <function1>
    

    好的,我们得到一个部分函数,​​将Location的一个实例转换为(Double,Double)的(可选)元组。

    接下来,&#34; unlift&#34;:

    scala> val hohoho = unlift(heyDude)
    hohoho: Location => (Double, Double) = <function1>
    
    scala> val loc = Location(1, 2)
    loc: Location = Location(1.0,2.0)
    
    scala> hohoho(loc)
    res16: (Double, Double) = (1.0,2.0)
    

    好的,所以... unlift简单地抛弃&#34; Option&#34;,并将我们直接带到元组。

    好的......所以...我猜......这个&#34;写道&#34; of Writes ... *)当给出Location的实例时,它将:

    1. 将该对象传递给unlift(Location.unapply)生成的部分函数。

    2. 然后将该部分函数返回的元组(Double,Double)引导到由此产生的任何内容:

      (JsPath \&#34; lat&#34;)。写[Double]和 (JsPath \&#34; long&#34;)。写[Double]

    3. 究竟是什么&#34;无论什么&#34;?遵循JsPath的API文档,我认为它是OWrites:https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.OWrites

      但是......我无法看到一个名为&#34;&#34;的方法。在OWrites。这是&#34;和#34;声明?它做了什么?它是:&#34; oWrites1和oWrites2&#34;生产&#34; oWrites3&#34;?这个&#34; oWrites3&#34;是一种特殊类型的OWrites,以元组为输入? ......如果是这样的话......元组在案例类中没有关于房产名称的信息(&#34; lat&#34;和&#34; long&#34 )。它是如何知道生成的json字符串应该是{&#34; lat&#34;:1,&#34; long&#34;:2}那么?

      很抱歉问题。请帮助我清楚地了解这一点。谢谢!

      *)https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Writes


      更新

1 个答案:

答案 0 :(得分:0)

如有疑问,请反编译。这表明存在隐式toFunctionalBuilderOps,然后you can see in FunctionalBuilderOps存在and方法