我想在我的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