Используя Лифт-JSON, есть ли простой способ извлечь и просмотреть список? - PullRequest
7 голосов
/ 22 февраля 2011

Я думаю, что я могу упустить что-то фундаментальное из архитектуры 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])

    }

}

1 Ответ

16 голосов
/ 22 февраля 2011

Если это вообще возможно, вам следует перейти на Lift JSON 2.3-M1 (http://www.scala -tools.org / repo-release / 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])

Лифт 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
...