Поднимите JSON LINQ как динамический шаблон извлечения

Я пытаюсь выполнить извлечение на основе XPath с помощью Lift JSON, за исключением того, что шаблон извлечения xpath определяется во время выполнения.

Чтобы проиллюстрировать это, я хотел бы преобразовать строку «a.b.c.d» в извлечение JSON Lift, используя (json \ «a» \ «b» \ «c»).extract[List[Int]]

import net.liftweb.json._
import net.liftweb.json.JsonDSL._
import net.liftweb.json.JsonAST._
import net.liftweb.json.Extraction._
implicit val formats = net.liftweb.json.DefaultFormats

val x = """{ "a" : { "b" : [ {"c" : 10},{ "c" : 20 } ] } }""" 
val json = parse(x)

val dataString = "a.b.c"

val dataList = dataString.split("\\.").toList
// List(a,b,c)

// Я хотел бы преобразовать приведенную выше строку в - (json \ "a" \ "b" \ "c").extract[List[Int]]

Можно ли использовать foldLeft для достижения этого шаблона?


person conikeec    schedule 15.03.2013    source источник


Ответы (1)


Если я понимаю ваш вопрос, это то, что вы хотите:

List("a", "b", "c").foldLeft(json){ _ \ _ }.extract[List[Int]]

И чтобы помочь понять, почему: foldLeft принимает два аргумента; начальное состояние и функция, которая принимает «текущее» состояние и следующий ввод, возвращая «следующее» состояние. «Входы» — это элементы того, для чего вы вызываете foldLeft, то есть List("a", "b", "c").

Поэтому, если вы используете json в качестве начального состояния, первым вызовом изменения состояния будет json \ "a". Следующим будет результат этого вычисления, обратная косая черта «b» и так далее.

person Dylan    schedule 15.03.2013