Python — Сравните два JSON с разной длиной и без порядка

#python #json #django #compare #nested-loops

Вопрос:

Я хочу сравнить два 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 из второго 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()
 

Однако этот алгоритм выполняется только по порядку, но мой список публикуется на основе данных выборки, и они расположены не в том же порядке.

Комментарии:

1. Вы хотите заменить старый JSON на новый на основе Id ключа?

Ответ №1:

Я проделал операцию с тремя разными петлями. Сначала я добавил 0 элементов идентификатора в качестве новых для запроса.

Я также сделал isUpdated=True, чтобы это не учитывалось в других циклах, потому что в других циклах я буду считать только isUpdated=Ложные атрибутированные элементы.

 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( пользователь=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 всех добавленных и перезаписанных элементов является ложным.

 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)