比较两个JSONObject结构(忽略它们的值)?

时间:2014-03-10 18:34:01

标签: java json unit-testing

我正在寻找一个JSON配对库,它支持比较两个JSON对象的结构,忽略值,子命令,以及 - 如果可能 - 可选地忽略响应中的其他元素;特别适用于针对预期结构从Web服务返回的JSON单元测试。 (我想将一个示例响应传递给assert方法,并将其结构与实际响应进行比较 - 而不必为每个节点编写断言。只要结构很好,获取不同的值不是问题。 。)

任何主要的JSON库都支持这个吗? (这个问题与Compare two JSON objects in Java基本相同,但我希望断言忽略我的JSON结构中的值,这可能看起来像Wikipedia上的示例...)

2 个答案:

答案 0 :(得分:0)

您可能想看看Guava及其Equivalence

如果你使用杰克逊,你会写一个Equivalence<JsonNode>,你可以根据自己的需要进行定制。

Here是这样的Equivalence的示例,如果递归地所有数字在数学上相等,则认为两个JSON值相等。

用法:yourEquivalence.equivalent(node1, node2)

另一种解决方案是编写一个POJO,序列化为您想要的JSON,并尝试将您的JSON反序列化为所述POJO。如果反序列化失败,那么结构就错了。

答案 1 :(得分:0)

我使用递归函数,如果您想忽略值类型,则可以通过返回true来更改其他条件值。

  • dict_var是您要验证的json
  • schema是dict_var必须遵循的架构

代码:

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