Json与python中对象之间的不同链接进行比较

时间:2017-03-28 09:30:40

标签: python json compare

我正在尝试比较2个json,它们在ids值中显示不同的顺序,即使它们在概念上是相同的,正如您从示例中看到的那样。

例如,每个person对象都根据其id指向Address对象。 ids可能不同,但是,从概念上讲,2 json是相同的。这里有一个例子:address_id的顺序是不同的(作为地址对象的位置),但是2 json是相同的,(John居住在纽约市和BCN的Pippo)。

{
   "Persons": [
     {
       "Name": "John",
       "Address_Id": "0"
     },
     {
       "Name": "Pippo",
       "Address_Id": "1"
     }
   ],
   "Addresses": [
     {
       "City": "NYC"
     },
     {
       "City": "BCN"
     }
   ]
 }


{
   "Persons": [
     {
       "Name": "John",
       "Address_Id": "1"
     },
     {
       "Name": "Pippo",
       "Address_Id": "0"
     }
   ],
   "Addresses": [
     {
       "City": "BCN"
     },
     {
       "City": "NYC"
     }
   ]
 }

有没有办法比较2 json考虑这个“特殊情况”??

感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过创建等效的Python类并自己实现比较来自行反序列化json 。例如:

import json

class Person_book:

    def __init__(self, person_list):
        self.person_list = person_list

    def __eq__(self, other):
        if len(self.person_list) != len(other.person_list):
            return False
        for person in self.person_list:
            if person not in other.person_list:
                return False
        return True

class Person:

    def __init__(self, person_id, address):
        self.person_id = person_id
        self.address = address

    def __str__(self):
        return str(self.person_id) + ' ' + str(self.address )

    def __eq__(self, other):
        if self.person_id == other.person_id and self.address == other.address:
            return True
        return False

def deserialize_persons(persons_array):
    persons = persons_array['Persons']
    addresses = persons_array['Addresses']
    person_list = []
    for person in persons:
        person_entry = Person(person['Name'], addresses[int(person['Address_Id'])])
        person_list.append(person_entry)
    return Person_book(person_list)

json_resp_1 = """{
   "Persons": [
     {
       "Name": "John",
       "Address_Id": "0"
     },
     {
       "Name": "Pippo",
       "Address_Id": "1"
     }
   ],
   "Addresses": [
     {
       "City": "NYC"
     },
     {
       "City": "BCN"
     }
   ]
 }"""

json_resp_2 = """
{
   "Persons": [
     {
       "Name": "John",
       "Address_Id": "1"
     },
     {
       "Name": "Pippo",
       "Address_Id": "0"
     }
   ],
   "Addresses": [
     {
       "City": "BCN"
     },
     {
       "City": "NYC"
     }
   ]
 }"""

resp_1 = json.loads(json_resp_1)
resp_2 = json.loads(json_resp_2)

person_book_1 = deserialize_persons(resp_1)
person_book_2 = deserialize_persons(resp_2)

print(person_book_1 == person_book_2)