游戏物品JSON格式转换求助:拆分嵌套附魔配方
游戏物品JSON数据格式转换方案
问题背景
手头有一份大型游戏物品JSON文件,存在两个核心问题导致数据难以导入Excel/Google Sheets使用:
craftresource字段格式不统一:部分是单个对象,部分是最多4个元素的数组enchantments中的附魔等级嵌套在原物品里,需要拆分为独立的物品条目,唯一名称格式为原名称@附魔等级(比如T3_MEAL_SOUP@1)
解决方案:Python脚本处理
Excel和Google Sheets的内置工具难以处理这种复杂的动态结构,用Python脚本是最灵活的方式,以下是现成的处理脚本,步骤简单:
脚本代码
import json def process_craftresource(resource): # 统一craftresource格式:数组转带序号的键值对,单个对象直接保留 if isinstance(resource, list): processed = {} for idx, res in enumerate(resource): if idx == 0: processed["@uniquename"] = res["@uniquename"] processed["@count"] = res["@count"] else: processed[f"@uniquename{idx+1}"] = res["@uniquename"] processed[f"@count{idx+1}"] = res["@count"] return processed else: return resource def main(): # 读取本地原始JSON文件(替换为你的文件路径) with open("Food_Formatted.json", "r", encoding="utf-8") as f: items = json.load(f) final_items = [] for item in items: # 1. 处理基础物品(无附魔) base_item = item.copy() # 统一基础物品的craftresource格式 if "craftingrequirements" in base_item: base_item["craftingrequirements"]["craftresource"] = process_craftresource( base_item["craftingrequirements"]["craftresource"] ) final_items.append(base_item) # 2. 拆分附魔等级为独立物品 if "enchantments" in item and "enchantment" in item["enchantments"]: for enchant in item["enchantments"]["enchantment"]: enchant_item = item.copy() # 修改唯一名称 level = enchant["@enchantmentlevel"] enchant_item["@uniquename"] = f"{item['@uniquename']}@{level}" # 替换为附魔对应的制作要求 enchant_item["craftingrequirements"] = enchant["craftingrequirements"] # 统一附魔物品的craftresource格式 enchant_item["craftingrequirements"]["craftresource"] = process_craftresource( enchant_item["craftingrequirements"]["craftresource"] ) # 删除冗余的enchantments字段 del enchant_item["enchantments"] final_items.append(enchant_item) # 导出处理后的JSON文件 with open("Processed_Food.json", "w", encoding="utf-8") as f: json.dump(final_items, f, indent=4, ensure_ascii=False) if __name__ == "__main__": main()
使用步骤
- 把原始JSON文件保存为
Food_Formatted.json,和脚本放在同一文件夹 - 安装Python(官网下载安装即可,勾选"Add Python to PATH"选项)
- 双击运行脚本,会生成
Processed_Food.json,里面就是处理好的数据:- 每个附魔等级都成为独立的物品条目
- 所有
craftresource都统一为单对象格式,数组元素会变成@uniquename1、@count1这类带序号的键值对 - 唯一名称自动按
原名称@等级格式生成
替代方案:在线工具(进阶)
如果不想装Python,也可以用jq工具处理,命令如下(需要先安装jq):
jq 'def process_res: if type == "array" then reduce .[] as $item ({}; . + (if ($index + 1) == 1 then {"@uniquename": $item."@uniquename", "@count": $item."@count"} else {"@uniquename\($index + 1)": $item."@uniquename", "@count\($index + 1)": $item."@count"} end)) else . end; .[] | .craftingrequirements.craftresource |= process_res | . as $base | [$base] + (.enchantments.enchantment[] | $base * {"@uniquename": ($base."@uniquename" + "@" + ."@enchantmentlevel"), "craftingrequirements": .craftingrequirements, "enchantments": null} | .craftingrequirements.craftresource |= process_res)' Food_Formatted.json > Processed_Food.json
但这个命令对新手不太友好,优先推荐Python脚本。
内容的提问来源于stack exchange,提问作者Rasmus Hornung
相关产品推荐
相关产品推荐

