比较python中的复杂json字符串
我试图使用python比较两个复杂的json字符串,但我遇到了一些问题。我拥有的两个字符串是相同的,但是子元素的一些字段以不同的顺序出现 例如: ipperms元素下的IpRanges列表以不同的顺序返回,这一事实似乎打破了比较;如果我将它们切换到相同的顺序,比较将正常工作 我尝试过使用OrderedDict,json.dumps'sort_keys=True'参数,以及使用sorted()函数,但无法比较字符串。有什么想法吗 任何帮助都将不胜感激 试试看:比较python中的复杂json字符串,python,json,Python,Json,我试图使用python比较两个复杂的json字符串,但我遇到了一些问题。我拥有的两个字符串是相同的,但是子元素的一些字段以不同的顺序出现 例如: ipperms元素下的IpRanges列表以不同的顺序返回,这一事实似乎打破了比较;如果我将它们切换到相同的顺序,比较将正常工作 我尝试过使用OrderedDict,json.dumps'sort_keys=True'参数,以及使用sorted()函数,但无法比较字符串。有什么想法吗 任何帮助都将不胜感激 试试看: sort\u keys对您没有帮助,
sort\u keys
对您没有帮助,因为IpRanges
是一个列表。已经有订单了。如果您想比较这些,您需要首先对对象中包含的任何列表进行排序……这将是一个棘手的问题,因为这些列表的成员是dict,本质上是不可排序的。是否有什么原因使您不能使用json.loads
将它们解析回Python本机类型,然后只进行简单的相等性测试?还有,拉尔克斯说的。:-)@ShadowRanger问题是数据不一定总是采用这种格式;有时会出现列表,有时不会,所以我不确定如何实现该解决方案…如果不先编写一些代码来规范两个字典中的数据,就无法实现。Bugger。我想在这种情况下,我必须在存储数据之前对数据进行排序,希望这样比较会更好。谢谢如果您尝试使用原始数据,您将看到frozenset实际上正在丢弃信息。所有这些告诉你的是a和b是否有相同的密钥(即,你实际上是在比较a.keys()和b.keys())。@larsks,用原始数据尝试了一下-它仍然有效。我做错了什么?查看的返回值,例如,frozenset(a)
。这只考虑原始字典中的顶级键名,不需要比较值。
a = """
{
"sgroupname":"windows_securezone",
"ipperms":[
{
"IpProtocol":"-1",
"IpRanges":[
{
"CidrIp":"194.66.78.xx/32"
},
{
"CidrIp":"86.17.73.xx/32"
}
],
"UserIdGroupPairs":[
],
"PrefixListIds":[
]
}
]
}
"""
b = """
{
"sgroupname":"windows_securezone",
"ipperms":[
{
"IpProtocol":"-1",
"IpRanges":[
{
"CidrIp":"86.17.73.xx/32"
},
{
"CidrIp":"194.66.78.xx/32"
}
],
"UserIdGroupPairs":[
],
"PrefixListIds":[
]
}
]
}
"""
In [200]: a
Out[200]:
{'ipperms': [{'IpProtocol': '-1',
'IpRanges': [{'CidrIp': '194.66.78.xx/32'}, {'CidrIp': '86.17.73.xx/32'}],
'PrefixListIds': [],
'UserIdGroupPairs': []}],
'sgroupname': 'windows_securezone'}
In [201]: b
Out[201]:
{'ipperms': [{'IpProtocol': '-1',
'IpRanges': [{'CidrIp': '86.17.73.xx/32'}, {'CidrIp': '194.66.78.xx/32'}],
'PrefixListIds': [],
'UserIdGroupPairs': []}],
'sgroupname': 'windows_securezone'}
In [202]: def ordered(obj):
.....: if isinstance(obj, dict):
.....: return sorted((k, ordered(v)) for k, v in obj.items())
.....: if isinstance(obj, list):
.....: return sorted(ordered(x) for x in obj)
.....: else:
.....: return obj
.....:
In [203]: ordered(a) == ordered(b)
Out[203]: True
In [204]: a == b
Out[204]: False