我一直在使用這個json combinator幾個基本/標準的情況下,沒有真正理解它是如何工作的。一切都很好。ScalaJsonCombinator中的「和」是什麼(定義Writes時)?
現在我想讓自己準備好任何先進的病例可能會來;我需要了解代碼。
參考: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 _)
它創建了一個讀取:
首先 - 當給予JsValue(通過其「讀取」方法) - 它拉動「lat」,然後是「long」。在這兩個中,它創建了一個元組(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)
這部分功能作爲輸入採用(雙人間,雙人間)的元組。所以...,步驟1的結果被引導到步驟2,並且我們得到位置的實例作爲「讀取」的返回。
現在的寫道:
implicit val locationWrites: Writes[Location] = (
(JsPath \ "lat").write[Double] and
(JsPath \ "long").write[Double]
)(unlift(Location.unapply))
首先是 「不應用」。我在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>
好了,我們得到了轉換位置的一個實例的(可選)元組的部分功能(雙人,雙人)。
接下來, 「unlift」:
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乾脆扔掉 「選項」,並直接把我們帶到了元組。
好...所以...我想...給定位置的一個實例時,這個「寫道:」寫操作... *),它將:
通行證,通過對象即unlift產生的部分函數(Location.unapply)。
由局部函數返回的元組(雙,雙)然後被引導到任何由該產生的:
(JsPath \ 「LAT」)寫[雙]和 (JsPath \「長「)。寫[雙]
到底什麼是「無論」?繼JsPath的API文檔後,我認爲它是OWrites:https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.OWrites
但是......我看不到在OWrites中有一個名爲「and」的方法。這個「和」在哪裏申報?它有什麼作用?是否:「oWrites1和oWrites2」產生「oWrites3」?而這個「oWrites3」是一種特殊類型的OWrites,它以元組作爲輸入? ...如果是這種情況...元組沒有關於case類中屬性名稱的信息(「lat」和「long」)。它如何知道生成的json字符串應該是{「lat」:1,「long」:2}呢?
對不起,列車問題。請幫助我清楚瞭解這一點。謝謝!
*)https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Writes
更新:
這實質上是你在更新中鏈接的問題的重複。 '和'只是'〜'的別名。如果你仍然不確定的事情,也許可以修改你的問題到你不瞭解的鏈接答案部分? –
謝謝。是的,我發佈我的問題後找到了鏈接。對搜索查詢進行了一些試驗以獲得這些結果,所以我把它放在這裏以便將來查找。 將關閉此問題。 –