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 嵌套键值对创建列和值
Scala Spark - 从简单的数据框创建嵌套的 json 输出