How to iterate org.json4s.JsonAST.JValue which is an array of JSON objects to separately work on each object in Scala?
13,059
Solution 1
The following is your json.
scala> json
res2: org.json4s.JValue = JArray(List(JObject(List((abc,JString(1)), (de,JString(1)))),
JObject(List((fgh,JString(2)), (ij,JString(4))))))
There are several ways.
-
use
for
syntaxfor { JArray(objList) <- json JObject(obj) <- objList } { // do something val kvList = for ((key, JString(value)) <- obj) yield (key, value) println("obj : " + kvList.mkString(",")) }
-
convert to
scala.collection
objectval list = json.values.asInstanceOf[List[Map[String, String]]] //=> list: List[Map[String,String]] = List(Map(abc -> 1, de -> 1), Map(fgh -> 2, ij -> 4))
or
implicit val formats = DefaultFormats val list = json.extract[List[Map[String,String]]] //=> list: List[Map[String,String]] = List(Map(abc -> 1, de -> 1), Map(fgh -> 2, ij -> 4))
and do something.
for (obj <- list) println("obj : " + obj.toList.mkString(","))
Both outputs are
obj : (abc,1),(de,1)
obj : (fgh,2),(ij,4)
The document of json4s is here.
Solution 2
You should be able to either cast to JArray
val myArray = myVal.asInstanceOf[JArray]
myArray.arr // the array
or preferably use a scala match so you can confirm the type is correct.
Comments
-
GKVM almost 2 years
I have a sample array:
[{ "abc":"1", "de":"1" }, { "fgh":"2", "ij":"4" }]
which is a org.json4s.JsonAST.JValue.
How is it possible to iterate over each object inside the array, to operate on each object separately?
-
Evhz about 6 yearsI was about to get into a scala match nightmare to solve this. Like this, it's just perfect.
-
Indicator almost 4 yearsCould you help to explain how this pattern matching works? t.filter( a => { a match { case JArray(b) => println(b) ; case other => println(other) } ; true }) . It returns 7 matches. List(JObject(List((abc,JString(1)), (de,JString(1)))), JObject(List((fgh,JString(2)), (ij,JString(4))))) JObject(List((abc,JString(1)), (de,JString(1)))) JString(1) JString(1) JObject(List((fgh,JString(2)), (ij,JString(4)))) JString(2) JString(4)