在JSON Circe Scala中遍历所有节点后有条件地添加字段



假设我有一个复杂的JSON:

{
"type": "object",
"properties": {
"first_name": { "type": "string" },
"last_name": { "type": "string" },
"birthday": { "type": "string", "format": "date" },
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" },
"country": { "type" : "string" }
}
}
}
}

我想将字段additionalProperties: false添加到所有具有type:object的json对象中在上面的例子中,输出json看起来像:

{
"type": "object",
"additionalProperties": false,
"properties": {
"first_name": { "type": "string" },
"last_name": { "type": "string" },
"birthday": { "type": "string", "format": "date" },
"address": {
"type": "object",
"additionalProperties": false,
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" },
"country": { "type" : "string" }
}
}
}
}

这就是我目前所拥有的:

val circeJson: io.circe.Json = parser.parse(json).getOrElse(io.circe.Json.Null)
val updatedJson = transform(circeJson)
def transform(js: io.circe.Json): io.circe.Json =
js
.mapArray(_.map(transform))
.mapObject(obj => obj.+:("additionalProperties", io.circe.Json.fromBoolean(false)))

出于某种原因,它只为根级别的对象工作并添加字段。

以下正在工作:

def transformJson(js: io.circe.Json, transformation: JsonObject => JsonObject): io.circe.Json =
js
.mapArray(_.map(transformJson(_, transformation)))
.mapObject(obj => transformation(obj).mapValues(obj => transformJson(obj, transformation)))
val circeJson: io.circe.Json = parser.parse(json).getOrElse(io.circe.Json.Null)
val updatedJson =
transformJson(circeJson, obj => obj.+:("additionalProperties", io.circe.Json.fromBoolean(false)))

最新更新