如何在scala中获取JSON的结构

时间:2015-04-21 16:50:33

标签: json scala apache-spark

我有很多没有结构化的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

我尝试了JacksonJson4s,他们可以有效地使用最后一个值,但是,我不知道如何获得整个结构。

我希望这能在非常庞大的JSON文件上运行带有apache spark的作业,并且每个文件的结构都非常复杂。我也尝试过sparkSQL,但如果我不知道整个结构,我就无法得到它。

1 个答案:

答案 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("")
}