使用jq或bash中的任何其他工具比较两个json文件

使用jq或bash中的任何其他工具比较两个json文件,json,bash,jq,containment,elaboration,Json,Bash,Jq,Containment,Elaboration,我想比较两个json文件,看看是否可以从另一个中提取一个。 P1(P1.json) P2(P2.json) 可以看出,P2并不完全等于P1,但它可以从P1中提取出来(它提供的关于同一个人的数据较少,但数据是正确的)。 预期行为: p1 extends p2 --> true p2 extends p1 --> false 注释 -不能使用某些附加元素从同一数组中提取数组以下扩展/1的定义使用纯粹基于对象的扩展定义(特别是,它不对数组排序)。关于阵列的OP要求我不清楚,但下一节提

我想比较两个json文件,看看是否可以从另一个中提取一个。

P1(P1.json)

P2(P2.json)

可以看出,P2并不完全等于P1,但它可以从P1中提取出来(它提供的关于同一个人的数据较少,但数据是正确的)。

预期行为:

p1 extends p2 --> true
p2 extends p1 --> false

注释

-不能使用某些附加元素从同一数组中提取数组

以下
扩展/1
的定义使用纯粹基于对象的扩展定义(特别是,它不对数组排序)。关于阵列的OP要求我不清楚,但下一节提供了一个变体定义

# Usage: $in | extends($b) iff $in contains $b in an object-based sense
def extends($b):
  # Handle the case that both are objects:
  def objextends($x):
    . as $in | all($x|keys[]; . as $k | $in[$k] | extends($x[$k]));
  # Handle the case that both are arrays:
  def arrayextends($x):
    . as $in
    | length == ($x|length) and
        all( range(0;length); . as $i | $in[$i] | extends($x[$i]));

  if . == $b then true
  else . as $in
  | type as $intype
  | ($intype == ($b|type)) and
      (($intype == "object" and objextends($b)) or
       ($intype == "array" and arrayextends($b)))
结束

示例:

{a:{a:1,b:2}, b:2} | extends({a:{a:1}}) # true

{a:{a:1,b:2}, b:2} | extends({a:{a:2}}) # false

{a:{a:1,b:2}, b:[{x:1,y:2}]} | extends({a:{a:2}, b:[{x:1}]}) # true
替代定义 以下定义对数组进行了排序,足以处理给定的示例:

# Usage: $in | extends2($b) iff $in contains $b in a way which ignores the order of array elements
def extends2($b):
  # Both are objects
  def objextends($x):
    . as $in | all($x|keys[]; . as $k | $in[$k] | extends($x[$k]));

  def arrayextends($x): ($x|sort) - sort == [];

  if . == $b then true
  else . as $in
  | type as $intype
  | ($intype == ($b|type)) and
      (($intype == "object" and objextends($b)) or
       ($intype == "array"  and arrayextends($b)))
  end;
带有$P1和$P2,如图所示:

  $P1 | extends2($P2) # yields true

下面的
extenses/1
定义使用了纯粹基于对象的扩展定义(特别是,它不排序数组)。关于阵列的OP要求我不清楚,但下一节提供了一个变体定义

# Usage: $in | extends($b) iff $in contains $b in an object-based sense
def extends($b):
  # Handle the case that both are objects:
  def objextends($x):
    . as $in | all($x|keys[]; . as $k | $in[$k] | extends($x[$k]));
  # Handle the case that both are arrays:
  def arrayextends($x):
    . as $in
    | length == ($x|length) and
        all( range(0;length); . as $i | $in[$i] | extends($x[$i]));

  if . == $b then true
  else . as $in
  | type as $intype
  | ($intype == ($b|type)) and
      (($intype == "object" and objextends($b)) or
       ($intype == "array" and arrayextends($b)))
结束

示例:

{a:{a:1,b:2}, b:2} | extends({a:{a:1}}) # true

{a:{a:1,b:2}, b:2} | extends({a:{a:2}}) # false

{a:{a:1,b:2}, b:[{x:1,y:2}]} | extends({a:{a:2}, b:[{x:1}]}) # true
替代定义 以下定义对数组进行了排序,足以处理给定的示例:

# Usage: $in | extends2($b) iff $in contains $b in a way which ignores the order of array elements
def extends2($b):
  # Both are objects
  def objextends($x):
    . as $in | all($x|keys[]; . as $k | $in[$k] | extends($x[$k]));

  def arrayextends($x): ($x|sort) - sort == [];

  if . == $b then true
  else . as $in
  | type as $intype
  | ($intype == ($b|type)) and
      (($intype == "object" and objextends($b)) or
       ($intype == "array"  and arrayextends($b)))
  end;
带有$P1和$P2,如图所示:

  $P1 | extends2($P2) # yields true

如果您知道在任何子阵列中都没有重复项,那么您可以使用这种方法来计算将数组索引替换为null返回的
[path,value]
对集之间的差异:

def details:[
     tostream
   | select(length==2) as [$p,$v]
   | [$p|map(if type=="number" then null else . end),$v]
];

def extends(a;b): (b|details) - (a|details) == [];
If
P1
P2
是返回样本数据的函数

def P1: {
    "id": 12,
    "keys": ["key1","key2"],
    "body": {
      "height": "180cm",
      "wight": "70kg"
    },
    "name": "Alex"
  }
;

def P2: {
    "id": 12,
    "keys": ["key2","key1"],
    "body": {
      "height": "180cm"
    }
  }
;
然后

在存在重复项的情况下,结果不太清楚。e、 g

  extends(["a","b","b"];["a","a","b"])  # returns true

如果您知道任何子阵列中都没有重复项,那么您可以使用这种方法来计算将数组索引替换为null返回的
[路径,值]
对集之间的差异:

def details:[
     tostream
   | select(length==2) as [$p,$v]
   | [$p|map(if type=="number" then null else . end),$v]
];

def extends(a;b): (b|details) - (a|details) == [];
If
P1
P2
是返回样本数据的函数

def P1: {
    "id": 12,
    "keys": ["key1","key2"],
    "body": {
      "height": "180cm",
      "wight": "70kg"
    },
    "name": "Alex"
  }
;

def P2: {
    "id": 12,
    "keys": ["key2","key1"],
    "body": {
      "height": "180cm"
    }
  }
;
然后

在存在重复项的情况下,结果不太清楚。e、 g

  extends(["a","b","b"];["a","a","b"])  # returns true

jq
中编程似乎近乎反常。我得学学学这些在
jq
中编程似乎近乎反常。我得学学学这些