Нерекурсивное извлечение в Lift JSON для понимания

Я использую for-comprehensions Lift JSON для разбора некоторых JSON. JSON является рекурсивным, поэтому, например. поле id существует на каждом уровне. Вот пример:

val json = """
{
  "id": 1
  "children": [
    {
      "id": 2
    },
    {
      "id": 3
    }
  ]
}
"""

Следующий код

var ids = for {
  JObject(parent) <- parse(json)
  JField("id", JInt(id)) <- parent
} yield id

println(ids)

производит List(1, 2, 3). Я ожидал, что это будет продукт List(1).

В моей программе это приводит к квадратичным вычислениям, хотя мне нужны только линейные.

Можно ли использовать for-comprehension для соответствия только полям id верхнего уровня?


person Ben Challenor    schedule 04.03.2012    source источник


Ответы (1)


Я не вникал достаточно глубоко, чтобы понять, почему понимание по умолчанию является рекурсивным, однако вы можете решить эту проблему, просто указав корень поиска:

scala>  for ( JField( "id", JInt( id ) ) <- parent.children ) yield id
res4: List[BigInt] = List(1)

Обратите внимание на использование parent.children.

person Tomer Gabel    schedule 04.03.2012