json - Scala,Circe - 如何检查 json 是否包含具有不同值的键?
问题描述
我有一个包含类似字段的 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
您可以看到这里运行的代码。
推荐阅读
- python - 在 f 字符串中循环作为嵌入的值
- prometheus - promQL API 端点
- javascript - JS:用键检查对象与 hasOwnProperty?
- java - 如何减少以下代码中的内存使用量?
- java - PDFbox 字体为空
- vb.net - VB.NET 触发 Datagridview 单元格单击按钮 CLick
- javascript - 如何在 console.log 中查看函数的输出?
- xml - 用于更新 XML 文件的 Powershell 脚本
- javascript - React TypeError:无法读取未定义的属性“nbaGames”
- java - 如何给面板内的列固定列宽?