json - 使用 lift-json 是否有一种简单的方法来提取和遍历列表?

标签 json list scala lift

我认为我可能遗漏了 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])

    }

}

最佳答案

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

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

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

关于json - 使用 lift-json 是否有一种简单的方法来提取和遍历列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5073747/

相关文章:

asp.net-mvc - 使用 $.ajax 发布 JSON 数据时如何提供 AntiForgeryToken?

json - Elasticsearch将嵌套的json视为纯字符串:无法在start_object上获取文本

python - 如何反转字典项并列出按公共(public)值分组的键

R如何在列表中找到向量子集的交集

javascript - 如何将包含 HTML 的 JSON 解析为 HTML

javascript - angularjs以json格式将数据发送到mvc Controller

html - 水平对齐包含 6 个元素的列表?

Scala 可变参数函数和 Seq

scala - Gatling:循环遍历馈线中的所有条目

Scala 对象和单例的兴起