2013-03-15 4 views
2

Я пытаюсь выполнить экстракцию на основе XPath с использованием Lift JSON за исключением того, что структура XPath экстракции определяется во время выполненияLift JSON LINQ Как Динамический Extraction шаблон

Чтобы проиллюстрировать это, я хотел бы преобразовать строку «ABCD» . Поднимите извлечение JSON с помощью (JSon \ "а" \ "Ъ" \ "C") извлечение [Список [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 [Список [Int]]

Можно ли использовать foldLeft для достижения этой картины ?

ответ

1

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

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

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

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