Вероятно това е лесно и моята трудност вероятно е причинена от новостта ми към Скала (която вече бързо се превръща в любимия ми език).
По принцип имам JSON, който изглежда така:
{
"to" : "Peter",
"from" : "Dave",
"bundle" : [
{"data": [1,2,3,4,5]},
{"data": [2,3,4,5,6]}
]
}
Сега, аз съм parsed този JSON до точката, където мога да издърпам данните от заглавието (до и от) и да гледам на отделните съобщения в пакета.В момента аз съм използвайки това:
val messages = parsedJSON \ "bundle" \ classOf[JObject]
for (m <- messages) println(m)
Което ми дава:
Map(data -> List(1, 2, 3, 4, 5))
Map(data -> List(2, 3, 4, 5, 6))
Но това, което искам да направя в този цикъл е да взема всяка карта и да я преобразувам обратно в JSON т.е .:
{
"data": [1,2,3,4,5]
}
Опитах да направя ренд (м) и различни други полу-случайни неща, за да се опитам да го накарам да работи, но досега няма зарове. Най-близкото, което дойдох, ми дава тази грешка:
No implicit view available from Any => net.liftweb.json.package.JValue.
Може ли някой да ме насочи в правилната посока?
Благодаря предварително!
Отговори:
3 за отговор № 1Мисля, че най-лесният начин да се справите с това есъздайте класа на кутия за пакет. Lift-json може да извлече добре данните в отделни случаи. След това можете просто да ги пренавиете и да ги превърнете обратно в JObjects, като имплицитно създавате 2-тила.
case class Bundle(data: List[BigInt])
val bundles = (parsedJSON \ "bundle").extract[List[Bundle]]
// List(Bundle(List(1, 2, 3, 4, 5)), Bundle(List(2, 3, 4, 5, 6)))
bundles
.map{ bundle => ("data" -> bundle.data)}
.foreach{ j => println(compact(render(j)))}
//{"data":[1,2,3,4,5]}
//{"data":[2,3,4,5,6]}
1 за отговор № 2
ако съобщенията могат да бъдат всякакви данни, можете да ги извлечете като JValues.
import net.liftweb.json._
import net.liftweb.json.JsonDSL._
val parsedJSON = parse(...)
val bundles = (parsedJSON \ "bundle").extract[List[JValue]]
compact(render(bundles))