Play [Scala]: How to flatten a JSON object

后端 未结 6 1120
無奈伤痛
無奈伤痛 2021-02-06 13:07

Given the following JSON...

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

... how do I convert it

6条回答
  •  佛祖请我去吃肉
    2021-02-06 14:01

    Based on previous solutions, have tried to simplify the code a bit

      def getNewKey(oldKey: String, newKey: String): String = {
        if (oldKey.nonEmpty) oldKey + "." + newKey else newKey
      }
    
      def flatten(js: JsValue, prefix: String = ""): JsObject = {
        if (!js.isInstanceOf[JsObject]) return Json.obj(prefix -> js)
        js.as[JsObject].fields.foldLeft(Json.obj()) {
          case (o, (k, value)) => {
            o.deepMerge(value match {
              case x: JsArray => x.as[Seq[JsValue]].zipWithIndex.foldLeft(o) {
                case (o, (n, i: Int)) => o.deepMerge(
                  flatten(n.as[JsValue], getNewKey(prefix, k) + s"[$i]")
                )
              }
              case x: JsObject => flatten(x, getNewKey(prefix, k))
              case x => Json.obj(getNewKey(prefix, k) -> x.as[JsValue])
            })
          }
        }
      }
    

提交回复
热议问题