Scala,Circe - 如何检查 json 是否包含具有不同值的键?

Scala, Circe - how to check if json contains keys with different values?

我有一个 json,其中包括类似的字段:

{
  "newData": {
    "data": {
      "field1": "value1",
      "field2": value2,
      "field3": "value3"
    }
  }
  "oldData" :{
    "data": {
      "field1": "value1",
      "field3": "someValue"
    }
  }
}

现在我想比较一下 newDataoldData。如果 newData 包括一些不在 oldData 中的新字段,我想将它们添加到 Set。此外,如果 newDataoldData 具有相同的字段,但具有不同的值,我也想将它们添加到 Set。如果它们相同,我想忽略。

我试着用 circe 这样做:

val newData = json.newData
val oldData = json.oldData
val result = newData.hcursor.keys.toSet
.filterNot(oldData.hcursor.keys.toSet)

如果 newData 有一些其他字段然后 oldData,它工作正常。但如果它们都具有相同的字段和其他值,则它不起作用。我不知道如何比较 json 中相同键的值,如果它们不同,则将它们添加到集合中。 我应该如何更改我的代码以包含它?

你可以确保两者都是 JsonObjects 然后选择新记录的所有键并检查旧记录中是否存在该键,如果存在则确保其内容是不同。

import io.circe.JsonObject

def findFieldsWithDifferences(oldData: JsonObject, newData: JsonObject): Set[String] =
  newData.toList.collect {
    case (newKey, newValue) if oldData(key = newKey).forall(_ != newValue) =>
      newKey
  }.toSet

可以看到代码运行 here.