首页 > 解决方案 > Scala,Circe - 如何检查 json 是否包含具有不同值的键?

问题描述

我有一个包含类似字段的 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 中相同键的值,如果它们不同,请将它们添加到设置中。我应该如何更改我的代码以包含它?

标签: jsonscalascala-catscirce

解决方案


您可以确保两者都是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

您可以看到这里运行的代码。


推荐阅读