Це, мабуть, легко, і мої труднощі, ймовірно, викликані моєю новизною до Scala (яка вже швидко стає моєю улюбленою мовою).
В основному у мене є JSON, який виглядає приблизно так:
{
"to" : "Peter",
"from" : "Dave",
"bundle" : [
{"data": [1,2,3,4,5]},
{"data": [2,3,4,5,6]}
]
}
Тепер я проаналізував цей 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))