【问题标题】:Using lift-json, is there an easy way to extract and traverse a list?使用lift-json,有没有一种简单的方法来提取和遍历一个列表?
【发布时间】:2011-07-01 17:15:18
【问题描述】:

我认为我可能遗漏了 list-json xpath 架构中的一些基本内容。我能够提取和遍历列表的最流畅的方式如下所示。谁能告诉我一个更好的技术:

class Example {

    @Test
    def traverseJsonArray() {

        def myOperation(kid:JObject) = println("kid="+kid)

        val json = JsonParser.parse("""
            {   "kids":[
                {"name":"bob","age":3},
                {"name":"angie","age":5},
            ]}
        """)

        val list = ( json \\ "kids" ).children(0).children
        for ( kid <- list ) myOperation(kid.asInstanceOf[JObject])

    }

}

【问题讨论】:

    标签: json list scala lift


    【解决方案1】:

    如果可能,您应该升级到 Lift JSON 2.3-M1 (http://www.scala-tools.org/repo-releases/net/liftweb/lift-json_2.8.1/2.3-M1/)。它包含两个重要的改进,另一个影响路径表达式。

    在 2.3 中,路径表达式永远不会返回 JFields,而是直接返回 JFields 的值。之后,您的示例将如下所示:

    val list = (json \ "kids").children
    for ( kid <- list ) myOperation(kid.asInstanceOf[JObject])
    

    Lift JSON 提供了多种样式来解析 JSON 中的值:路径表达式、查询理解和案例类提取。可以混合和匹配这些样式并获得我们经常做的最佳结果。为了完整起见,我将为您提供上述示例的一些变体,以便更好地了解这些不同的风格。

    // Collect all JObjects from 'kids' array and iterate
    val JArray(kids) = json \ "kids"
    kids collect { case kid: JObject => kid } foreach myOperation
    
    // Yield the JObjects from 'kids' array and iterate over yielded list
    (for (kid@JObject(_) <- json \ "kids") yield kid) foreach myOperation
    
    // Extract the values of 'kids' array as JObjects
    implicit val formats = DefaultFormats
    (json \ "kids").extract[List[JObject]] foreach myOperation
    
    // Extract the values of 'kids' array as case classes
    case class Kid(name: String, age: Int)
    
    (json \ "kids").extract[List[Kid]] foreach println
    
    // Query the JSON with a query comprehension
    val ks = for { 
      JArray(kids) <- json
      kid@JObject(_) <- kids
    } yield kid 
    ks foreach myOperation
    

    【讨论】:

    • 这是对列表提取的改进,谢谢。现在我需要在没有显式类型转换的情况下神奇地应用操作...
    • 嗨,你能解释一下查询理解示例中的JArray(kids) &lt;- json 吗? kids 变量来自哪里?
    猜你喜欢
    • 2019-07-21
    • 2019-11-23
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多