Scala、Circe、Json - 如何从 json 中删除父节点?

问题描述

我有一个这样的 json 结构:

"data" : {
  "fields": {
    "field1": "value1","field2": "value2"
  }
}

现在我想删除 fields 节点并将数据保留在 data 中:

"data" : {
   "field1": "value1","field2": "value2"
 }

我试着这样做:

val result = data.hcursor.downField("fields").as[JsonObject].toOption.head.toString

但我得到了一个奇怪的结果,而不仅仅是字符串格式的 json

我也试过:

val result = data.hcursor.downField("fields").top.head.toString

但它是一样的:

val result = data.toString

包括 fields

我应该如何更改代码删除 fields 根并将数据保留在 data 属性下?

解决方法

这是一个完整的工作解决方案,它遍历 JSON、提取字段、删除它们然后将它们合并到 data 下:

import io.circe.Json
import io.circe.parser._

val s =
  """
    |{
    |"data": {
    |  "fields": {
    |    "field1": "value1",|    "field2": "value2"
    |  }
    |}
    |}
    |""".stripMargin

val modifiedJson =
  for {
    json <- parse(s)
    fields <- json.hcursor
                .downField("data")
                .downField("fields")
                .as[Json]
    modifiedRoot <- json.hcursor
                      .downField("data")
                      .downField("fields")
                      .delete
                      .root
                      .as[Json]
    res <-
      modifiedRoot.hcursor
        .downField("data")
        .withFocus(_.deepMerge(fields))
        .root
        .as[Json]
  } yield res

产量:

Right({
  "data" : {
    "field1" : "value1","field2" : "value2"
  }
})