加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

播放[Scala]:如何展平JSON对象

发布时间:2020-12-16 18:26:42 所属栏目:安全 来源:网络整理
导读:鉴于以下 JSON …… { "metadata": { "id": "1234","type": "file","length": 395 }} …我该如何将其转换为 { "metadata.id": "1234","metadata.type": "file","metadata.length": 395} TX. 解决方法 这绝对不是微不足道的,但可以通过尝试递归地展平它.我没
鉴于以下 JSON ……

{
  "metadata": {
    "id": "1234","type": "file","length": 395
  }
}

…我该如何将其转换为

{
  "metadata.id": "1234","metadata.type": "file","metadata.length": 395
}

TX.

解决方法

这绝对不是微不足道的,但可以通过尝试递归地展平它.我没有对此进行彻底的测试,但它适用于您的示例以及我使用数组提出的其他一些基本功能:

object JsFlattener {

    def apply(js: JsValue): JsValue = flatten(js).foldLeft(JsObject(Nil))(_++_.as[JsObject])

    def flatten(js: JsValue,prefix: String = ""): Seq[JsValue] = {
        js.as[JsObject].fieldSet.toSeq.flatMap{ case (key,values) =>
            values match {
                case JsBoolean(x) => Seq(Json.obj(concat(prefix,key) -> x))
                case JsNumber(x) => Seq(Json.obj(concat(prefix,key) -> x))
                case JsString(x) => Seq(Json.obj(concat(prefix,key) -> x))
                case JsArray(seq) => seq.zipWithIndex.flatMap{ case (x,i) => flatten(x,concat(prefix,key + s"[$i]")) }  
                case x: JsObject => flatten(x,key))
                case _ => Seq(Json.obj(concat(prefix,key) -> JsNull))
            }
        }
    }

    def concat(prefix: String,key: String): String = if(prefix.nonEmpty) s"$prefix.$key" else key

}

JsObject有一个fieldSet方法,它返回一个Set [(String,JsValue)],我将其映射,与JsValue子类进行匹配,并从那里继续递归消耗.

您可以通过传递JsValue来应用此示例:

val json = Json.parse("""
    {
      "metadata": {
        "id": "1234","length": 395
      }
    }
"""
JsFlattener(json)

我们将它作为练习留给读者,使代码看起来更漂亮.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读