def flattenJsObject(obj: JsObject): JsObject = { val newObj = obj.fields.map { case (name, value) => value match { case o: JsObject => Some((name, o)) case _ => None } }.flatMap(o => o).foldLeft(obj) { case (prev, next) => JsObject(prev.fields.filterNot { case (name, value) => name == next._1 }) ++ next._2 } if (newObj.fields.exists { case (name, value) => value.isInstanceOf[JsObject] }) { flattenJsObject(newObj) } else { newObj } }