如何迭代org.json4s.JsonAST.JValue这是一个JSON对象数组,分别处理Scala中的每个对象?

GKV*_*KVM 6 json scala json4s

我有一个示例数组:

[{
    "abc":"1",
    "de":"1"
},
{
    "fgh":"2",
    "ij":"4"
}]
Run Code Online (Sandbox Code Playgroud)

这是一个org.json4s.JsonAST.JValue.

如何迭代数组中的每个对象,分别对每个对象进行操作?

小智 14

以下是你的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))))))
Run Code Online (Sandbox Code Playgroud)

有几种方法.

  1. 使用for语法

    for {
      JArray(objList) <- json
      JObject(obj) <- objList
    } {
      // do something
      val kvList = for ((key, JString(value)) <- obj) yield (key, value)
      println("obj : " + kvList.mkString(","))
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转换为scala.collection对象

    val list = json.values.asInstanceOf[List[Map[String, String]]]
    //=> list: List[Map[String,String]] = List(Map(abc -> 1, de -> 1), Map(fgh -> 2, ij -> 4))
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    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))
    
    Run Code Online (Sandbox Code Playgroud)

    做点什么

    for (obj <- list) println("obj : " + obj.toList.mkString(","))
    
    Run Code Online (Sandbox Code Playgroud)

两个输出都是

obj : (abc,1),(de,1)
obj : (fgh,2),(ij,4)
Run Code Online (Sandbox Code Playgroud)

json4s的文件在这里.


Yur*_*mke 6

你应该能够投射到JArray

val myArray = myVal.asInstanceOf[JArray]
myArray.arr // the array
Run Code Online (Sandbox Code Playgroud)

或者最好使用scala匹配,以便确认类型是否正确.