Пример не дает точный JSON, который вы опубликовали, но я думаю, вы поймете, как фильтровать произвольный JSON с помощью play.json
:
def filterByName(name: String, filter: JsValue, js: JsValue): JsValue = js match {
case JsArray(vs) => JsArray(vs.map(filterByName(name, filter, _)))
case JsObject(vs) =>
JsObject(vs.flatMap { case (key, value) =>
if (key == name && value == filter) None
else Some(key -> filterByName(name, filter, value))
})
case otherwise => otherwise
}
def filterByString(name: String, value: String, js: JsValue): JsValue =
filterByName(name, JsString(value), js)
Редактировать: Если я правильно понимаю ваш вариант использования, вы можетеРеализуйте логику фильтра следующим образом - в приведенном выше примере фильтруются отдельные элементы из входного JSON, а этот фильтрует «окружающие» объекты, если один из его элементов удовлетворяет предикату:
def filterObjElements(name: String, value: JsValue, js: JsValue): JsValue = {
def filter(current: JsValue): Option[JsValue] = current match {
case JsArray(vs) => Some(JsArray(vs.flatMap(filter)))
case JsObject(vs) =>
if (vs.exists { case (key, value0) => key == name && value0 == value})
None
else {
Some(JsObject(vs.flatMap { case (key, value0) =>
filter(value0).map(key -> _)
}))
}
case otherwise => Some(otherwise)
}
js match {
case arr: JsArray => filter(arr).getOrElse(JsArray())
case obj: JsObject => filter(obj).getOrElse(JsObject(Nil))
case otherwise => otherwise
}
}
def filterObjElements(name: String, value: String, js: JsValue): JsValue =
filterObjElements(name, JsString(value), js)