【发布时间】:2021-12-06 09:53:58
【问题描述】:
我正在寻找一种使两个嵌套 JSON 对象相交的通用方法,以便检索所有常见的键值对。
鉴于以下 JSON 文档
{
"a": 0,
"b": [
"ba",
{
"bb": {
"bba": "a",
"bbc": [1, 2]
}
},
{
"bc": {
"bca": [2],
"bcb": 5
}
}
],
"c": 1
}
和
{
"a": 1,
"b": [
"ba",
{
"bb": {
"bba": "a",
"bbc": [1,3]
}
}
],
"c": 1
}
我想找到他们的交点。 我希望得到以下 JSON 文档,其中仅包含两个输入中都存在的键值对 JSON 对象:
{
"b": [
"ba",
{
"bb": {
"bba": "a",
"bbc": [1]
}
}
],
"c": 1
}
我查看了 jq 的文档,但找不到有关如何执行此操作的提示。
我尝试使用减号运算符没有成功,产生object ... and object cannot be subtracted。
cat obj-list.txt | jq -c '.[1] - (.[0] - .[1])'
你能给我一些关于如何用 jq 完成嵌套 JSON 对象的交集的提示吗?
提前感谢您帮助我。
更新:
鉴于 JSON 对象不具有完全相同的结构,但不同,例如 a = {"a": [{"aa":1]}, b = {"a": 0}。我对如何添加错误检查以捕获 Cannot index number with string-errors 等的解决方案感兴趣?
【问题讨论】:
-
不是你的问题的一部分,但顺便说一句:总是更喜欢
jq ... <obj-list.txt或jq ... obj-list.txt或<obj-list.txt jq ...而不是cat obj-list.txt | jq ...。特别是对于 jq 来说,这并不是什么大问题,但它实际上是其他命令(tail.wc -c等)的 O(1) 和 O(n) 操作之间的差异,并且对于其他命令(f /e,sort可以使用真实的文件句柄并行化其操作,但不能使用来自cat的管道,因为多个线程或子进程只能使用可搜索的文件句柄并行读取输入)。 -
感谢您提醒我UUOC!没想到这里。 :)