我有很多没有结构化的JSON文件,我希望得到一个更深层的元素和所有元素来实现它。
例如:
{
"menu": {
"id": "file",
"popup": {
"menuitem": {
"module"{
"-vdsr": "New",
"-sdst": "Open",
"-mpoi": "Close" }
...
}
}
在这种情况下,结果将是:
menu.popup.menuitem.module.-vdsr
menu.popup.menuitem.module.-sdst
menu.popup.menuitem.module.-mpoi
我尝试了Jackson
和Json4s
,他们可以有效地使用最后一个值,但是,我不知道如何获得整个结构。
我希望这能在非常庞大的JSON文件上运行带有apache spark的作业,并且每个文件的结构都非常复杂。我也尝试过sparkSQL,但如果我不知道整个结构,我就无法得到它。
答案 0 :(得分:0)
您要求做的事实上是对象的tree traversal,其中JSON对象被视为具有命名分支的节点,而其他JSON类型被视为叶子。有很多方法可以做到这一点。您可以考虑创建一个探索整个树的递归函数。这是一个适用于PlayJson
的示例,但在其他库中应该没有什么不同:
import play.api.libs.json._
def unfold(json: JsValue): Seq[String] = json match {
case JsObject(kvps) => kvps.flatMap {
case (key, value) => unfold(value).map(path => s"$key.$path")
}
case _ => Seq("")
}