如果字段是嵌套的,如何向 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,然后可以将其
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" : {
}
}