Play: How to remove the fields without value from JSON and create a new JSON with them
Asked Answered
S

3

6

Given the following JSON:

{
  "field1": "value1",
  "field2": "",
  "field3": "value3",
  "field4": ""
}

How do I get two distinct JSONs, one containing the fields with value and another one containing the fields without value? Here below is how the final result should look like:

{
  "field1": "value1",
  "field3": "value3"
}

{
  "field2": "",
  "field4": ""
}
Spinal answered 1/7, 2014 at 14:35 Comment(1)
and just looping through and building two new objects isn't sufficient?Guncotton
B
7

You have access to the JSON object's fields as a sequence of (String, JsValue) pairs and you can filter through them. You can filter out the ones with and without value and use the filtered sequences to construct new JsObject objects.

import play.api.libs.json._

val ls =
  ("field1", JsString("value1")) ::
  ("field2", JsString("")) ::
  ("field3", JsString("value3")) ::
  ("field4", JsString("")) ::
  Nil

val js0 = new JsObject(ls)

def withoutValue(v: JsValue) = v match {
  case JsNull => true
  case JsString("") => true
  case _ => false
}

val js1 = JsObject(js0.fields.filterNot(t => withoutValue(t._2)))
val js2 = JsObject(js0.fields.filter(t => withoutValue(t._2)))
Beason answered 1/7, 2014 at 15:56 Comment(0)
P
7

You can improve @nietaki solution by using partition function.

import play.api.libs.json._

val ls =
  ("field1", JsString("value1")) ::
    ("field2", JsString("")) ::
    ("field3", JsString("value3")) ::
    ("field4", JsString("")) ::
    Nil

val js0 = new JsObject(ls)

def withoutValue(v: JsValue) = v match {
  case JsNull => true
  case JsString("") => true
  case _ => false
}

val (js1, js2) = js0.fields.partition(t => withoutValue(t._2))
JsObject(js1)
JsObject(js2)
Peeling answered 2/7, 2014 at 13:39 Comment(0)
L
0

You can also do it in a one liner:

val (js1, js2) = j.fields.partition(_._2 != JsString(""))
println(JsObject(js1))
println(JsObject(js2))

Code run at Scastie

Lohman answered 10/12, 2020 at 10:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.