Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较python中的复杂json字符串_Python_Json - Fatal编程技术网

比较python中的复杂json字符串

比较python中的复杂json字符串,python,json,Python,Json,我试图使用python比较两个复杂的json字符串,但我遇到了一些问题。我拥有的两个字符串是相同的,但是子元素的一些字段以不同的顺序出现 例如: ipperms元素下的IpRanges列表以不同的顺序返回,这一事实似乎打破了比较;如果我将它们切换到相同的顺序,比较将正常工作 我尝试过使用OrderedDict,json.dumps'sort_keys=True'参数,以及使用sorted()函数,但无法比较字符串。有什么想法吗 任何帮助都将不胜感激 试试看: sort\u keys对您没有帮助,

我试图使用python比较两个复杂的json字符串,但我遇到了一些问题。我拥有的两个字符串是相同的,但是子元素的一些字段以不同的顺序出现

例如:

ipperms元素下的IpRanges列表以不同的顺序返回,这一事实似乎打破了比较;如果我将它们切换到相同的顺序,比较将正常工作

我尝试过使用OrderedDict,json.dumps'sort_keys=True'参数,以及使用sorted()函数,但无法比较字符串。有什么想法吗

任何帮助都将不胜感激

试试看:


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