使用 Circe 将嵌套字段添加到 JSON

问题描述 投票:0回答:1

问题

如果字段是嵌套的,如何向 Json 对象添加字段?

这与此论坛类似:使用 Circe 将字段添加到 JSON

但不是:

{
  ExistingField: {},
  "Newfield" : {}
}

我的最终目标是这样的:

{
  ExistingField: {},
  "A" : {
    "B" : {
      "C" : "myStringValue"
    }
  },
  "AA" : {
    "BB" : "myStringValue" 
  }
}

尝试过

我有一个 String 类型的嵌套字段列表,我想对其进行迭代并添加。
我没有将它们嵌套,而是得到:

{
  ExistingField: {},
  "A.B.C" : "myStringValue"
}

我的字段列表如下所示:

val listOfFields: List[String] = List("A.B.C", "AA.BB")
json scala arraylist circe
1个回答
0
投票

递归函数使用模式匹配将列表转换为嵌套的 Json,然后可以将其

deepMerge
转换为原始 Json。
foldLeft
重复执行此操作。

import io.circe.generic.auto._
import io.circe.parser
import io.circe.syntax._
import io.circe.Json

val jsonStr = """{"Fieldalreadythere": {}}"""

val jsonParse = parser.parse(jsonStr)


val listOfFields: List[String] = List("A.B.C", "AA.BB")

val listOfSplitFields = listOfFields.map(_.split("\\.").toList)


def makeJson(list: List[String]): Json = {
  list match {
    case h :: Nil => Json.fromFields(List((h, Json.fromString("stringValue"))))
    case h :: t => Json.fromFields(List(h -> makeJson(t)))
    case Nil => Json.fromFields(Nil)
  }
}


val originalJson = jsonParse match {
       case Right(value) => value.asObject
       case Left(error) => throw error
    }


val updateJsons = listOfSplitFields.map(makeJson(_))
updateJsons.foldLeft(originalJson.asJson)(_.deepMerge(_))

结果(类型为

io.circe.Json
):

{
  "AA" : {
    "BB" : "stringValue"
  },
  "A" : {
    "B" : {
      "C" : "stringValue"
    }
  },
  "Fieldalreadythere" : {

  }
}
© www.soinside.com 2019 - 2024. All rights reserved.