我希望将JSON响应的输出与我定义的字典进行比较。字典和JSON对象未订购。
从我自己的测试中,将此JSON响应存储为res.data
{
"message": "Staff name and password pair not match",
"errors": {
"resource": "Login",
"field": "staff_authentication",
"code": "invalid",
"stack_trace": null
}
}
我找不到anything that refers to Dictionary comparison operator in Python documentation。我已经阅读了有关从JSON字符串加载的排序字典的文章,但是根据我自己的测试,比较运算符可以正常工作而无需排序。
与这个不同排序的词典相比,将产生True
invalid_password_json = dict(
errors=dict(
resource="Login",
code="invalid",
field="staff_authentication",
stack_trace=None,),
message="Staff name and password pair not match",
)
assert json.loads(res.data, object_pairs_hook=OrderedDict) == invalid_password_json
我需要使用json.dumps(my_password, sort_keys=True)
或json.loads(res.data, object_pairs_hook=OrderedDict))
来确保比较前的订单吗?
答案 0 :(得分:2)
据我所知,您不需要对字典中的键进行排序,正如相当古老的python documentation所述:
映射(字典)比较相等,当且仅当它们已排序 (键,值)列表比较相等。(5.4)除了相等之外的结果 一致地解决,但没有另外定义。 (5.5)
......平等。 (5.4)
实现有效地计算它,而不构造列表或排序。
...定义。 (5.5)
早期版本的Python使用排序(键,值)列表的字典比较,但这对于常见的非常昂贵 比较平等的情况。一个更早版本的Python 仅通过身份比较字典,但这引起了惊喜 因为人们期望能够测试字典的空虚 将其与{}进行比较。
另外,知道在python中,字典是使用哈希表而不是平衡树实现的。
答案 1 :(得分:1)
从手册中:python通过比较它们的排序键值对来比较字典。
在我看来,这意味着即使密钥没有排序,它们也会按排序顺序进行比较,这似乎是比较2个字典的唯一合理方法。
所以我相信你不需要到use sort_keys=True
,但不知怎的,这可能是一种优化。
答案 2 :(得分:1)
Python dicts是无序的,如果它们具有相同的键,则两个dicts比较相等:值对(无论顺序如何),句点。所以你不需要对你自己的dict和json解析的dict进行排序。