我正在寻找一个JSON配对库,它支持比较两个JSON对象的结构,忽略值,子命令,以及 - 如果可能 - 可选地忽略响应中的其他元素;特别适用于针对预期结构从Web服务返回的JSON单元测试。 (我想将一个示例响应传递给assert方法,并将其结构与实际响应进行比较 - 而不必为每个节点编写断言。只要结构很好,获取不同的值不是问题。 。)
任何主要的JSON库都支持这个吗? (这个问题与Compare two JSON objects in Java基本相同,但我希望断言忽略我的JSON结构中的值,这可能看起来像Wikipedia上的示例...)
答案 0 :(得分:0)
您可能想看看Guava及其Equivalence
。
如果你使用杰克逊,你会写一个Equivalence<JsonNode>
,你可以根据自己的需要进行定制。
Here是这样的Equivalence
的示例,如果递归地所有数字在数学上相等,则认为两个JSON值相等。
用法:yourEquivalence.equivalent(node1, node2)
。
另一种解决方案是编写一个POJO,序列化为您想要的JSON,并尝试将您的JSON反序列化为所述POJO。如果反序列化失败,那么结构就错了。
答案 1 :(得分:0)
我使用递归函数,如果您想忽略值类型,则可以通过返回true来更改其他条件值。
代码:
def verify_config_parameters_structure(dict_var, schema):
try:
# If it's a dictionary
if isinstance(dict_var, dict):
if isinstance(schema, dict):
# Verify The object does not have more keys
for k2, v2 in dict_var.items():
if verify_config_parameters_structure(dict_var[k2], schema[k2]) is False:
return False
# Verify The object does have at least the schema keys
for k2, v2 in schema.items():
if verify_config_parameters_structure(dict_var[k2], schema[k2]) is False:
return False
return True
else:
return False
# If it's a list
elif isinstance(dict_var, list):
if isinstance(schema, list):
for item in dict_var:
if verify_config_parameters_structure(item, schema[0]) is False:
return False
return True
else:
return False
# If it's a value
else:
if type(dict_var) is type(schema):
return True
else:
return False
except:
return False