Объединить/перезаписать, когда раздел JSON заполнен/завершен

Вопрос или проблема

У меня есть очень специфическая «проблема», где я хотел бы перезаписать определенные данные в FILE1 тем, что найдено в FILE2, если оно будет завершено.
Немного предыстории может быть очень нужно.
Два файла JSON принадлежат модификации Minecraft, называемой Better Questing 2 (https://www.curseforge.com/minecraft/mc-mods/better-questing)
В этом моде используются отдельные файлы JSON для отслеживания прогресса каждого игрока. Эти квесты созданы на заказ (не мной), что не совсем помогает в этой ситуации. Я хочу как-то объединить эти файлы.

Я постараюсь привести пример ниже, чтобы, надеюсь, помочь понять, чем я хочу закончить.
Ниже вы можете увидеть вырезки из двух файлов, как они есть сейчас, а затем то, что я хотел бы получить в итоге.

FILE1:

"27:10": {
    "questID:3": 27,
        "completed:9": {},
        "tasks:9": {
            "0:10": {
                "completeUsers:9": {},
                "userProgress:9": {},
                "index:3": 0,
                "taskID:8": "bq_standard:retrieval"
         }
     }
},

А вот файл для другого игрока Minecraft. Этот игрок, как вы можете видеть, завершил указанный квест.

FILE2:

"27:10": {
    "questID:3": 27,
    "completed:9": {
        "0:10": {
            "claimed:1": 1,
            "uuid:8": "UUID2",
            "timestamp:4": 1726327347588
        }
    },
    "tasks:9": {
        "0:10": {
            "completeUsers:9": {
                "0:8": "UUID2"
            },
        "userProgress:9": {
            "0:10": {
                "data:11": [
                    1
                ],
                "uuid:8": "UUID2"
            }
        },
        "index:3": 0,
        "taskID:8": "bq_standard:retrieval"
        }
    }
},

А теперь посмотрите, как я хотел бы, чтобы это выглядело в окончательной форме:

FILE1:

"27:10": {
    "questID:3": 27,
    "completed:9": {
        "0:10": {
            "claimed:1": 1,
            "uuid:8": "UUID1",
            "timestamp:4": 1726327347588
        }
    },
    "tasks:9": {
        "0:10": {
            "completeUsers:9": {
                "0:8": "UUID1"
            },
        "userProgress:9": {
            "0:10": {
                "data:11": [
                    1
                ],
                "uuid:8": "UUID1"
            }
        },
        "index:3": 0,
        "taskID:8": "bq_standard:retrieval"
        }
    }
},

Настоящая проблема здесь в том, что два файла сильно различаются в том, какие квесты FILE1 считаются завершенными по сравнению с FILE2. Два более длинных примера файлов можно найти в ссылках pastebin в конце поста.

Итак, в общем, вот с чем я хотел бы получить помощь.
Если квест завершен в FILE2, я хотел бы, чтобы весь этот раздел («27:10» в случае примера) перезаписал то, что уже написано в FILE1.
Если он уже завершен в FILE1 и не завершен в FILE2, или если они завершены в обоих, ничего не должно быть перезаписано/изменено в этой части.
Не обязательно, чтобы UUID был изменен, пока это делается, так как это можно сделать с помощью простой функции «поиск и замена».

Надеюсь, кто-то может иметь идею, поскольку мне бы очень не хотелось проходить через оба этих файла JSON на 40 тысяч+ строк. Большое спасибо!

Более длинные вырезки из файлов можно найти здесь, где определенные квесты завершены в FILE1, но не в FILE2.
FILE1:
https://pastebin.com/xgnmJb1h
FILE2:
https://pastebin.com/WA8EZqEY

Ответ или решение

Для решения вашей задачи по объединению и перезаписи данных в JSON-файлах, я предлагаю вам использовать Python. В этом языке есть удобные средства для работы с JSON, которые позволят вам эффективно перезаписывать данные в FILE1 на основе содержимого FILE2. Давайте разберем шаги, которые нужно выполнить.

Шаги для реализации:

  1. Считывание JSON-файлов: Сначала нужно загрузить оба JSON-файла в Python.

  2. Перезапись данных: После загрузки, проверим, есть ли у нас завершенные квесты в FILE2 и, если они отсутствуют в FILE1, перезаписываем данные из FILE2 в FILE1.

  3. Сохранение результата: На последнем этапе нужно сохранить измененный FILE1 обратно в файл.

Пример кода

Вот пример кода, который иллюстрирует описанные шаги:

import json

# Загрузка JSON файлов
with open('FILE1.json', 'r') as f1, open('FILE2.json', 'r') as f2:
    file1_data = json.load(f1)
    file2_data = json.load(f2)

# Обновление данных FILE1 на основе данных FILE2
for quest_id, quest_data in file2_data.items():
    # Если квест завершен в FILE2 и отсутствует в FILE1, тогда перезаписываем
    if quest_id in file1_data:
        # Проверяем, завершен ли квест в FILE2
        if 'completed:9' in quest_data and quest_data['completed:9']:
            # Перезаписываем данные из FILE2 в FILE1
            file1_data[quest_id] = quest_data

# Сохранение обновленного FILE1
with open('FILE1_updated.json', 'w') as f1_updated:
    json.dump(file1_data, f1_updated, indent=4)

print("Успешно обновлено!")

Объяснение кода:

  1. Импортируем модуль json: Этот модуль необходим для работы с JSON-файлами.
  2. Считываем данные из файлов: Используя json.load(), мы загружаем данные из JSON-файлов в переменные file1_data и file2_data.
  3. Перезапись данных: Перебираем каждый квест в file2_data. Если квест завершен и есть в FILE1, мы перезаписываем его.
  4. Сохранение: После обновления мы сохраняем новый JSON в файл FILE1_updated.json.

Замена UUID

Если вам нужно заменить UUID, вы можете добавить дополнительный шаг перед сохранением, используя метод str.replace() для строки, чтобы изменить UUID на желаемый.

# Пример для замены UUID
new_uuid = "UUID1"
for quest_id in file1_data.keys():
    if 'uuid:8' in file1_data[quest_id]['completed:9'].get('0:10', {}):
        old_uuid = file1_data[quest_id]['completed:9']['0:10']['uuid:8']
        file1_data[quest_id]['completed:9']['0:10']['uuid:8'] = new_uuid

Заключение

Этот пример кода предоставляет вам базовую структуру для решения вашей задачи. Вам может потребоваться настроить код в зависимости от ваших конкретных данных и форматов JSON, но в целом этот подход должен помочь вам эффективно объединить данные из двух файлов, соблюдая условия, описанные в вашем вопросе.

Оцените материал
Добавить комментарий

Капча загружается...