Вопрос или проблема
У меня есть очень специфическая «проблема», где я хотел бы перезаписать определенные данные в 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
. Давайте разберем шаги, которые нужно выполнить.
Шаги для реализации:
-
Считывание JSON-файлов: Сначала нужно загрузить оба JSON-файла в Python.
-
Перезапись данных: После загрузки, проверим, есть ли у нас завершенные квесты в
FILE2
и, если они отсутствуют вFILE1
, перезаписываем данные изFILE2
вFILE1
. -
Сохранение результата: На последнем этапе нужно сохранить измененный
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("Успешно обновлено!")
Объяснение кода:
- Импортируем модуль
json
: Этот модуль необходим для работы с JSON-файлами. - Считываем данные из файлов: Используя
json.load()
, мы загружаем данные из JSON-файлов в переменныеfile1_data
иfile2_data
. - Перезапись данных: Перебираем каждый квест в
file2_data
. Если квест завершен и есть вFILE1
, мы перезаписываем его. - Сохранение: После обновления мы сохраняем новый 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, но в целом этот подход должен помочь вам эффективно объединить данные из двух файлов, соблюдая условия, описанные в вашем вопросе.