2016-04-07 16 views
1

İki karmaşık json dizesini python kullanarak karşılaştırmaya çalışıyorum ancak bazı sorunlar yaşıyorum. Sahip olduğum iki ip de aynı, ama bazı alt öğeler farklı düzenlerde ortaya çıkıyor.Python'da karmaşık json dizelerini karşılaştırma

EG:

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":[ 

     ] 
     } 
    ] 
} 
""" 

farklı bir sırayla ipperms eleman geri dönüş altında IpRanges listesi karşılaştırma kırmak görünmektedir gerçeği; onları aynı siparişe değiştirirsem karşılaştırma doğru çalışır.

OrderedDict, json.dumps 'sort_keys = True' parametresini ve sıralanmış() işlevini kullanmayı denedim, ancak karşılaştırmak için dizeleri alamıyorum. Herhangi bir fikir?

Herhangi bir yardım çok takdir edilecektir!

+1

'sort_keys' *' IpRanges' a * liste olduğu için size yardım edecek değildir. Zaten bir emri var. Bunları karşılaştırmak isterseniz, önce nesnelerinizde bulunan herhangi bir listeyi sıralamanız gerekir ... ki bu zor olacaktır, çünkü bu listelerde üyeler doğası gereği sıralanabilir olmayan diktedir. – larsks

+0

Python yerel türlerine 'json.loads' ile geri dönüp sadece eşitlik sınamaları yapamayacağınızın bir nedeni var mı? Ayrıca, larsklar ne dedi. :-) – ShadowRanger

+0

@ShadowRanger Sorun, verilerin her zaman bu formatta olması gerekmeyeceğidir; bazen başka zamanlar mevcut değildir, bu yüzden bu çözümü nasıl uygulayacağımdan emin değilim ... – Ben

cevap

1

this approach deneyin:

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 
+0

Bunu orijinal verilerle denerseniz, frozenset'in aslında bilgileri attığını görürsünüz. Tüm bunlar, a ve b'nin aynı tuşlara sahip olup olmadığını söyler (yani, esasen a.keys() 'i b.keys() ile karşılaştırırsınız. – larsks

+0

@larsks, orijinal verilerle denedi - hala çalışıyor. Neyi yanlış yapıyorum? – MaxU

+0

Örneğin, “frozenset (a)” nın dönüş değerine bakın. Bu, yalnızca orijinal sözlükteki en üst düzey anahtar isimleri dikkate alır ve değerleri karşılaştırmak için bir şey değildir. – larsks

İlgili konular