Python - 比较两个 JSON 不同长度且无顺序
Python - Compare two JSON with different length and without order
我想比较两个 json 没有顺序的数据,因为相同的项目有不同的顺序。例如先 json:
[{'Id': 113, 'Label': 'Z', 'Input': 'Z', 'Updated': False},
{'Id': 124, 'Label': ' X', 'Input': ' X', 'Updated': False},
{'Id': 128, 'Label': ' C', 'Input': ' C', 'Updated': False},
{'Id': 117, 'Label': ' R', 'Input': ' R', 'Updated': False},
{'Id': 118, 'Label': ' T', 'Input': ' T', 'Updated': False}]
第二个Json
[{'Id': 128, 'Label': ' C1', 'Input': ' C1', 'Updated': False},
{'Id': 118, 'Label': ' T1', 'Input': ' T1', 'Updated': False}
{'Id': 113, 'Label': 'Z2', 'Input': 'Z2', 'Updated': False},]
我想从第二个 json 更新不同的数据但相同的 ID json 并从第一个 Json 删除第二个 json 没有的数据。所以我的循环如下:
for form in selectedUserForm:
for jsonItem in getJson:
if form.id == jsonItem['Id'] and form.isUpdated == False:
form.metaKey = jsonItem['Label']
form.metaVal = jsonItem['Input']
form.isUpdated = True
form.save()
elif jsonItem['Id'] == 0:
newMeta = UserMeta(user = selectedUser, metaVal = jsonItem['Input'].title(), metaKey = jsonItem['Label'].title(), isUpdated = True)
newMeta.full_clean()
newMeta.save()
elif form.isUpdated == False:
form.isDeleted = True
form.isUpdated = True
form.save()
然而,此算法仅按顺序排列,但我的列表是从获取数据发布的,它们的顺序不同。
我用三个不同的循环进行了操作。首先,我将 0 个 id 项作为新项添加到查询中。
我也做了 isUpdated=True 所以它不会在其他循环中计数因为在其他循环中我只会计算 isUpdated=False 属性项。
for jsonItem in getJson:
if jsonItem['Id'] == 0:
newMeta = ProductMeta(user=selectedProduct, metaVal=jsonItem['Input'].title(
), metaKey=jsonItem['Label'].title(), isUpdated=True)
newMeta.full_clean()
newMeta.save()
我调用了应该更新的查询。
selectedProductForm = ProductMeta.objects.filter(
user=selectedProduct, isDeleted=False, isUpdated=False)
更新操作的覆盖方法。
for form in selectedProductForm:
for jsonItem in getJson:
if form.id == jsonItem['Id'] and form.isUpdated == False:
if jsonItem['Label'] is not None and jsonItem['Label'][0:1].isalnum() == True:
form.metaKey = jsonItem['Label'].title()
else:
form.metaKey = form.metaKey
if jsonItem['Input'] is not None and jsonItem['Input'][0:1].isalnum() == True:
form.metaVal = jsonItem['Input'].title()
form.isUpdated = True
form.save()
因此,将只剩下可删除的项目,因为所有添加和覆盖的项目的 isUpdate 属性都是 False。
for form in selectedProductForm:
if form.isUpdated == False:
form.isDeleted = True
form.isUpdated = True
form.save()
在所有这些操作之后,我将所有项目设置为 isUpdated=false,以便稍后再次进行更新操作。
formRefresh = UserMeta.objects.filter(
user=selectedProduct).update(isUpdated=False)
我想比较两个 json 没有顺序的数据,因为相同的项目有不同的顺序。例如先 json:
[{'Id': 113, 'Label': 'Z', 'Input': 'Z', 'Updated': False},
{'Id': 124, 'Label': ' X', 'Input': ' X', 'Updated': False},
{'Id': 128, 'Label': ' C', 'Input': ' C', 'Updated': False},
{'Id': 117, 'Label': ' R', 'Input': ' R', 'Updated': False},
{'Id': 118, 'Label': ' T', 'Input': ' T', 'Updated': False}]
第二个Json
[{'Id': 128, 'Label': ' C1', 'Input': ' C1', 'Updated': False},
{'Id': 118, 'Label': ' T1', 'Input': ' T1', 'Updated': False}
{'Id': 113, 'Label': 'Z2', 'Input': 'Z2', 'Updated': False},]
我想从第二个 json 更新不同的数据但相同的 ID json 并从第一个 Json 删除第二个 json 没有的数据。所以我的循环如下:
for form in selectedUserForm:
for jsonItem in getJson:
if form.id == jsonItem['Id'] and form.isUpdated == False:
form.metaKey = jsonItem['Label']
form.metaVal = jsonItem['Input']
form.isUpdated = True
form.save()
elif jsonItem['Id'] == 0:
newMeta = UserMeta(user = selectedUser, metaVal = jsonItem['Input'].title(), metaKey = jsonItem['Label'].title(), isUpdated = True)
newMeta.full_clean()
newMeta.save()
elif form.isUpdated == False:
form.isDeleted = True
form.isUpdated = True
form.save()
然而,此算法仅按顺序排列,但我的列表是从获取数据发布的,它们的顺序不同。
我用三个不同的循环进行了操作。首先,我将 0 个 id 项作为新项添加到查询中。
我也做了 isUpdated=True 所以它不会在其他循环中计数因为在其他循环中我只会计算 isUpdated=False 属性项。
for jsonItem in getJson:
if jsonItem['Id'] == 0:
newMeta = ProductMeta(user=selectedProduct, metaVal=jsonItem['Input'].title(
), metaKey=jsonItem['Label'].title(), isUpdated=True)
newMeta.full_clean()
newMeta.save()
我调用了应该更新的查询。
selectedProductForm = ProductMeta.objects.filter( user=selectedProduct, isDeleted=False, isUpdated=False)
更新操作的覆盖方法。
for form in selectedProductForm:
for jsonItem in getJson:
if form.id == jsonItem['Id'] and form.isUpdated == False:
if jsonItem['Label'] is not None and jsonItem['Label'][0:1].isalnum() == True:
form.metaKey = jsonItem['Label'].title()
else:
form.metaKey = form.metaKey
if jsonItem['Input'] is not None and jsonItem['Input'][0:1].isalnum() == True:
form.metaVal = jsonItem['Input'].title()
form.isUpdated = True
form.save()
因此,将只剩下可删除的项目,因为所有添加和覆盖的项目的 isUpdate 属性都是 False。
for form in selectedProductForm:
if form.isUpdated == False:
form.isDeleted = True
form.isUpdated = True
form.save()
在所有这些操作之后,我将所有项目设置为 isUpdated=false,以便稍后再次进行更新操作。
formRefresh = UserMeta.objects.filter(
user=selectedProduct).update(isUpdated=False)