【问题标题】:scala -- handling nested json and missing filedsscala -- 处理嵌套的 json 和缺失的字段
【发布时间】:2018-03-29 06:43:47
【问题描述】:

我正在寻找如下处理 json 文件

{
    "fixed": "abc",
    "issues": [{
        "issue": "issue0",
        "fields": {
            "value": "value1"
        }
    }, {
        "issue": "issue1",
        "fields": {
            "value": "value2"
        }
    }]
}

我正在寻找爆炸 json。我可以在很多方面做到这一点。 我正在寻找处理丢失 json 字段的方法。

例如,我需要查询字段“nonexistingcolumn”,它可能存在于某些 json 文件中,而可能不存在于另一个文件中。

输出应该是表格形式,如下所示。

fixed |  issue |  value | nonexitingcolumn
abc   | issue0 | value1 | null
abc   | issue1 | value2 | null

更新: nonexistingcolumn 是嵌套 json 的一部分,例如:“issues.fields.name”。

【问题讨论】:

  • 嗨,你能举个不存在的列的例子吗
  • 嗨 Raj ..刚刚更新了帖子..它将作为“issues.fields.name”作为嵌套 json 的一部分。我们需要处理 Json 文件实例中不存在该字段的情况。

标签: json scala


【解决方案1】:

我的解决方案包括几个步骤:

  1. 将 json 解析为某个模型对象。
  2. 建表
  3. (可选)表格的控制台输出

第一步可以通过play-json库来完成:

libraryDependencies += "com.typesafe.play" %% "play-json" % "2.6.7"

该库允许自动生成格式化程序,有助于将 json 解析为相应的 Scala 类。或许其他的 json 库也可以做到这一点。

第 2 步和第 3 步是技术性的。关键是我们将“字段”对象建模为 Map[String, String]。

val json: JsValue = Json.parse(
    """
  {
    "fixed": "abc",
    "issues": [{
    "issue": "issue0",
    "fields": {
      "value": "value1"
    }
  }, {
    "issue": "issue1",
    "fields": {
      "value": "value2",
      "nonexistingcolumn": "blabla"
    }
  }]
  }""")

  case class Issue(issue: String, fields: Map[String, String])
  case class Model(fixed: String, issues: List[Issue])

  implicit val issueFormat = Json.format[Issue]
  implicit val modelFormat = Json.format[Model]

  val model = json.as[Model]

  val fieldNames = (for {
    issue <- model.issues
    field <- issue.fields
  } yield field._1) distinct

  val table = model.issues map { issue =>
    model.fixed :: issue.issue :: (fieldNames map { fieldName =>
      issue.fields.getOrElse(fieldName, "null")
    })
  }

  val headers = (List("fixed", "issue") ++ fieldNames)
  val tableWithHeaders =  headers :: table

  tableWithHeaders foreach { row =>
    println(row map (" %-20s ".format(_)) mkString("|"))
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多