我正在成为play-json从东海岸到西海岸模式的粉丝,尤其是它对组合子的使用。我在一起处理一些复杂的案子。我知道有一种更好的方法,但我对构建功能的combinator方法还不熟悉。
我想把这个转变成:
{
"somearray": [
{
"field1": "value1",
"field2": "value1",
"key": "key1"
},
{
"field1": "second1",
"field2": "second1",
"key": "key2"
}
]
}如下所示:
{
"someObj": {
"key1":
{
"field1": "value1",
"field2": "value1"
},
"key2":
{
"field1": "second1",
"field2": "second1"
}
]
}我可以让它工作,但我退出了转换:
(__ \ "someObj").json.copyFrom(__ \ "someArray".json.pick.map {
case JsArray(arr) => {
JsObject(arr.map(a =>
a.transform(<A transform function to prune key>).map(pruned => {
((a \ "key").as[String], pruned)
}).flatMap({
case JsSuccess(result, _) => Seq(result)
case other => Nil
})
}
case other => JsNull
})这段代码有一些问题:我知道它很冗长,我知道我假设“THere”是一个字符串类型,我需要flatMap把我从JsResult中解脱出来,进入一些我可以用来构建JsValue JsObject。
看起来我应该能够
1)创建子转换,即a.transform()可以嵌套在父转换中,而无需解压缩和重新打包json对象。
谢谢。
发布于 2014-12-11 22:11:13
这样如何(忽略这段代码仍然存在您已经提到的相同问题)?
def elementTransform = for {
keyValue <- (__ \ 'key).json.pick // picks value for key field
obj <- (__ \ 'key).json.prune // returns object without the key field
res <- (__ \ keyValue.as[String]).json.put(obj) // uses the keyValue as a field name
} yield res
val transform = (__ \ "someObj").json.copyFrom((__ \ "someArray").json.pick[JsArray].map(
_.value.foldLeft[JsResult[JsObject]](JsSuccess(Json.obj()))(
(obj, a) =>
for {
o <- obj
field <- a.transform(elementTransform)
} yield o ++ field
).fold(_ => JsNull, identity)
))https://stackoverflow.com/questions/27412695
复制相似问题