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"
}
}
}
现在我想比较一下 newData
和 oldData
。如果 newData
包括一些不在 oldData
中的新字段,我想将它们添加到 Set
。此外,如果 newData
和 oldData
具有相同的字段,但具有不同的值,我也想将它们添加到 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.
我有一个 json,其中包括类似的字段:
{
"newData": {
"data": {
"field1": "value1",
"field2": value2,
"field3": "value3"
}
}
"oldData" :{
"data": {
"field1": "value1",
"field3": "someValue"
}
}
}
现在我想比较一下 newData
和 oldData
。如果 newData
包括一些不在 oldData
中的新字段,我想将它们添加到 Set
。此外,如果 newData
和 oldData
具有相同的字段,但具有不同的值,我也想将它们添加到 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.