Вопрос или проблема
У меня есть два очень длинных файла JSON, и моя цель — получить объединенный файл, в котором данные, отсутствующие в одном из них, будут скопированы/переписаны в другом.
Вот пример.
ФАЙЛ1:
"27:10": {
"questID:3": 27,
"completed:9": {},
"tasks:9": {
"0:10": {
"completeUsers:9": {},
"userProgress:9": {},
"index:3": 0,
"taskID:8": "bq_standard:retrieval"
}
}
},
ФАЙЛ2:
"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"
}
}
},
Чтобы дать немного понимания. Эти два примера из мода Minecraft под названием ‘Better Questing 2’, и два разных файла принадлежат двум разным пользователям. Мне кажется, это не имеет большого значения.
Что мне на самом деле хотелось бы сделать, так это зарегистрировать, что "questID:3": 27"
завершен в файле 2, но не в файле 1, и затем переписать то, что написано в файле 1, данными из файла 2. Не так важно, чтобы UUID изменился с UUID2 на UUID1, поскольку это можно сделать с помощью простой ‘замены’. К сожалению, сам мод Minecraft не имеет такой функции, и, насколько я могу видеть, довольно ручной способ — единственный способ сделать это. Я просто не знаю, как заставить компьютер помочь мне с этими 40 000+ строками файлов JSON.
Некоторые более длинные примеры двух файлов можно увидеть на этих двух pastebin.
ФАЙЛ1:
https://pastebin.com/xgnmJb1h
Ответ или решение
Чтобы объединить данные из двух json-файлов и при этом заполнить отсутствующие значения из одного файла в другой, можно воспользоваться языком программирования Python с библиотекой json
. Ниже представлен шаги и пример кода, который позволит выполнить эту задачу.
Шаги:
- Загрузить json-данные из обоих файлов.
- Сравнить данные по ключам и проверить наличие необходимых значений.
- Обновить значения в первом файле данными из второго, если они отсутствуют.
- Сохранить изменённые данные обратно в первый файл.
Пример кода на Python:
import json
# Функция для загрузки json-файла
def load_json(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
# Функция для сохранения json-файла
def save_json(data, file_path):
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# Функция для объединения данных
def merge_json(file1_data, file2_data):
for key in file2_data:
# Проверяем, существует ли ключ в file1_data
if key not in file1_data:
# Если ключа нет, добавляем его из file2_data
file1_data[key] = file2_data[key]
else:
# При наличии ключа, проверяем его содержимое
for sub_key in file2_data[key]:
if sub_key not in file1_data[key]:
file1_data[key][sub_key] = file2_data[key][sub_key]
else:
# Если подключ уже есть, проверяем заполненность
for inner_key in file2_data[key][sub_key]:
if inner_key not in file1_data[key][sub_key] or not file1_data[key][sub_key][inner_key]:
file1_data[key][sub_key][inner_key] = file2_data[key][sub_key][inner_key]
return file1_data
# Пути к файлам
file1_path = 'path/to/your/file1.json'
file2_path = 'path/to/your/file2.json'
# Загрузка данных из файлов
file1_data = load_json(file1_path)
file2_data = load_json(file2_path)
# Объединение данных
merged_data = merge_json(file1_data, file2_data)
# Сохранение объединенных данных обратно в file1
save_json(merged_data, file1_path)
Описание кода:
- Функция
load_json
загружает json-файлы. - Функция
save_json
сохраняет изменённые данные обратно в json-файл с удобным форматированием. - Функция
merge_json
объединяет данные, проверяет наличие ключей и обновляет недостающие значения в первом файле данными из второго. - В завершение, после объединения, данные сохраняются обратно в файл 1.
Примечание:
После выполнения этого сценария вам достаточно будет выполнить поиск и замену UUID, если это необходимо, чем можно легко управлять с помощью простого текстового редактора или дополнительного кода.
Этот подход позволит вам автоматически обработать ваши файлы, не требуя ручного вмешательства даже при большом количестве данных.