Python - Сравнение двух JSON разной длины и без порядка
Я хочу сравнить два 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},]
Я хочу обновить разные данные, но тот же ID json из второго 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 как новые в Query.
Я также сделал 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)