我有以下代码将Json对象重新格式化为另一个Json对象:
val newJson = Json.toJson(retJson.fields.flatMap {
case (epoch, obj) => obj.as[JsObject].fields.map(epoch -> _)
}.groupBy(_._2._1)
.mapValues(
_.map {
case (epoch, (k, v)) => {
var epochDate = epoch.substring(0, 13).toLong
epochDate = convertEpoch(epochDate, timezoneOffset)
Seq[Double](epochDate, sensorCalculations(whatevers, Option(v.as[String])))
}
}))
这很好但我们有一个新的要求,当一个值为-1时,我们应该忽略这个元素,而不是在结果中包含它。我不知道如何正确地做到这一点。
---编辑---
我尝试过以下操作会导致匹配错误
case (epoch, (k, v)) if v.as[String] != "-1" => {
感谢。
答案 0 :(得分:0)
您可以在适当的位置添加if子句。例如,可以检查值k:
....
case (epoch, (k, v)) if(!(k==-1))=> {
...
答案 1 :(得分:0)
val newJson = Json.toJson(retJson.fields.flatMap {
case (epoch, obj) => obj.as[JsObject].fields.map(epoch -> _)
}.groupBy(_._2._1)
.mapValues(
_.collect {
case (epoch, (k, v)) if v != -1 => {
var epochDate = epoch.substring(0, 13).toLong
epochDate = convertEpoch(epochDate, timezoneOffset)
Seq[Double](epochDate, sensorCalculations(whatevers, Option(v.as[String])))
}
}))
答案 2 :(得分:0)
以下解决方案对我有用:
val il = for {
(epoch, obj) <- retJson.fields
(k, v) <- obj.as[JsObject].fields
if v.as[String] != "-1"
} yield (epoch, (k, v))
val mapResult = il.groupBy(_._2._1)
.mapValues(
_.map {
case (epoch, (k, v)) => {
var epochDate = epoch.substring(0, 13).toLong
epochDate = convertEpoch(epochDate, timezoneOffset)
Seq[Double](epochDate, sensorCalculations(whatevers, Option(v.as[String])))
}
})