我一直在使用这个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:
首先 - 当给出一个JsValue(通过它的"读取"方法) - 它拉出" lat",然后是" long&#34 ;。在这两个中,它创建了一个元组(Double,Double)。 - https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Reads
然后将该元组分配给该Reads ...的部分函数,在这种情况下是" Location.apply _"返回的内容。我在repl中试过了:
...
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的实例时,它将:
将该对象传递给unlift(Location.unapply)生成的部分函数。
然后将该部分函数返回的元组(Double,Double)引导到由此产生的任何内容:
(JsPath \&#34; lat&#34;)。写[Double]和 (JsPath \&#34; long&#34;)。写[Double]
究竟是什么&#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
更新
答案 0 :(得分:0)
如有疑问,请反编译。这表明存在隐式toFunctionalBuilderOps
,然后you can see in FunctionalBuilderOps存在and
方法