/ / Візуалізація JSON з розбору JSON з використанням lift-json у Scala - синтаксичний аналіз, scala, візуалізація, lift-json

Рендеринг JSON з розбору JSON за допомогою підйому json у Scala - аналіз, скала, рендеринг, підйомник

Це, мабуть, легко, і мої труднощі, ймовірно, викликані моєю новизною до 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))