我想在我的Play框架應用程序(Scala)中創建Json讀者。問題是,我的Json的一部分是有點時髦,並需要進一步處理來檢索值。例如:玩Json - 複雜的對象創建
{
"field1":"value1",
"field2":"value/1",
"num2":2
}
與case類:
case class Field1(text: String, fields: Field2)
case class Field2(text: String, num: Int, num2: Int)
基本上爲Field2
的text
和num
字段從值value/1
衍生,通過分割文本。這是分離器功能:
def splitter(path: String, num2: Int): Field2 = {
val split = path.split("\\")
Field2(split(0), split(1).toInt, num2)
}
這是相當簡單的,實際的分配器功能要複雜得多。基本上構造這個對象Field2
的唯一方法是將一個單一的字符串傳遞給一個能夠吐出所需對象的函數。
如何去創造Field2
(通過擴展爲Field1
)讀者?
這是我到目前爲止有:
object Field1 {
implicit val reader = (
(__ \ "field1").read[String] and
(__).read[Field2]
) (Field1.apply _)
}
object Field2 {
implicit val reader = (
splitter((__ \ "field2").read[String], (__ \ "num2"))
) // Obviously incorrect syntax + type mismatch, but this is roughly what I'm trying to accomplish.
}
這精美的作品。但是沒有辦法使用常規的函數式語法嗎?我在我的代碼的其他部分中使用過,我想保持一致。 – Jeff
@Jeff函數語法的問題在於,您無法引用先前的字段來計算事物。一旦你調用apply,你可以修改生成的Reader,但是你需要一箇中間類型來跟蹤你計算的數據。另外,在某些情況下,您可能會遇到功能語法的性能問題:https://www.lucidchart.com/techblog/2016/08/29/speeding-up-restful-services-in-play-framework/ – gregghz
@Jeff我添加了一個使用函數語法的例子。 – gregghz