scala -- 处理嵌套的 json 和缺失的字段

Posted

技术标签:

【中文标题】scala -- 处理嵌套的 json 和缺失的字段【英文标题】:scala -- handling nested json and missing fileds 【发布时间】: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 文件实例中不存在该字段的情况。 【参考方案1】:

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

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

第一步可以通过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("|"))
  

【讨论】:

以上是关于scala -- 处理嵌套的 json 和缺失的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache Spark 和 Scala 创建嵌套 json

无法使用 Spark/Scala 从 JSON 嵌套键值对创建列和值

在pyspark中展平嵌套的json scala代码

Scala Spark - 从简单的数据框创建嵌套的 json 输出

在scala中将spark决策树模型调试字符串转换为嵌套JSON

使用 circe 在 Scala 中 JSON 将嵌套字段解码为 Map[String, String]