【问题标题】:How to iterate org.json4s.JsonAST.JValue which is an array of JSON objects to separately work on each object in Scala?如何迭代 org.json4s.JsonAST.JValue 这是一个 JSON 对象数组,分别在 Scala 中的每个对象上工作?
【发布时间】:2016-04-26 05:37:38
【问题描述】:

我有一个示例数组:

[{
    "abc":"1",
    "de":"1"
},
{
    "fgh":"2",
    "ij":"4"
}]

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

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

【问题讨论】:

    标签: json scala json4s


    【解决方案1】:

    您应该可以转换为 JArray

    val myArray = myVal.asInstanceOf[JArray]
    myArray.arr // the array
    

    或者最好使用 scala 匹配,这样您就可以确认类型是否正确。

    【讨论】:

    • 我正要陷入一场 scala 比赛的噩梦来解决这个问题。像这样,简直完美。
    【解决方案2】:

    以下是你的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))))))
    

    有几种方法。

    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(","))
      }
      
    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))
      

      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))
      

      然后做点什么。

      for (obj <- list) println("obj : " + obj.toList.mkString(","))
      

    两个输出都是

    obj : (abc,1),(de,1)
    obj : (fgh,2),(ij,4)
    

    json4s的文档是here

    【讨论】:

    • 您能帮忙解释一下这种模式匹配是如何工作的吗? t.filter( a => { a match { case JArray(b) => println(b) ; case other => println(other) } ; true }) 。它返回 7 个匹配项。 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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多