播放[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) 我们将它作为练习留给读者,使代码看起来更漂亮. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |