如何合并多份MC服务器玩家进度JSON文件以恢复进度状态?
合并MC玩家进度JSON文件,保留所有True值的实操方案
核心逻辑
MC玩家进度存储在world/playerdata/[玩家UUID].json的Advancements字段中,每个进度项以done: true/false标记完成状态。我们的目标是:只要某个进度在任意一份备份文件中是done: true,就保留这个完成状态;所有文件中均为false的进度,保留最新备份的状态。
方法一:零代码在线合并(适合纯新手)
- 提取进度片段:打开每个玩家的4份文件,找到
"Advancements"对应的完整大括号内容(从{到}),复制出来分别保存为adv1.json、adv2.json、adv3.json、adv4.json(文件名自行区分即可)。 - 选择合并工具:找支持「布尔值优先保留true」「深度合并」的JSON合并工具(优先选本地运行的工具,避免泄露玩家数据)。
- 执行合并:
- 依次导入4个进度JSON文件;
- 设置合并规则:布尔类型值优先保留
true,其他字段(如进度完成时间)保留最新文件的内容; - 导出合并后的JSON,复制回原玩家文件的
Advancements字段位置,覆盖原有内容。
方法二:Python脚本合并(适合学习入门)
如果想借这个机会学些基础编程,用Python脚本是最灵活的方式:
- 安装Python:从官网下载并默认安装(勾选"Add Python to PATH"选项)。
- 准备文件:把4个进度JSON文件和新建的脚本放在同一个文件夹里。
- 编写脚本:新建文本文件,重命名为
merge_adv.py,粘贴以下代码:
import json # 替换成你的4个进度文件的文件名 file_list = [ "adv_damaged.json", "adv_day_before.json", "adv_pre_crash.json", "adv_post_crash.json" ] final_advancements = {} for file_name in file_list: with open(file_name, 'r', encoding='utf-8') as f: current_adv = json.load(f) for adv_id, adv_details in current_adv.items(): # 如果该进度已经标记为完成,跳过后续文件的同进度 if adv_id in final_advancements and final_advancements[adv_id].get("done") is True: continue # 否则更新为当前文件的进度信息 final_advancements[adv_id] = adv_details # 保存合并结果 with open("merged_advancements.json", 'w', encoding='utf-8') as f: json.dump(final_advancements, f, indent=4) print("合并完成!结果已保存到merged_advancements.json")
- 运行脚本:双击脚本文件,或者打开命令行进入文件夹,输入
python merge_adv.py。 - 替换内容:打开生成的
merged_advancements.json,把里面的内容复制回原玩家文件的Advancements字段。
关键注意事项
- 先备份:操作前一定要复制所有原文件到安全位置,避免操作失误导致数据彻底丢失。
- 测试验证:合并后可以先在单人模式导入玩家文件,确认进度显示正常再放到服务器上。
- 字段冲突处理:如果进度项还有
progress这类其他字段,脚本会保留最后读取的文件内容;如果需要调整规则,可以修改脚本中final_advancements[adv_id] = adv_details的逻辑(比如优先保留有progress字段的版本)。
内容的提问来源于stack exchange,提问作者ComicAdam
相关产品推荐
相关产品推荐

