CastleDB(.cdb)解析JSON生成Faction结构及存回问题求助
解决CastleDB派系数据解析与保存问题
我来帮你搞定这个CastleDB数据解析和回写的问题!结合你给出的JSON结构和需求,分两步来实现:
一、从CDB JSON中提取派系数据,构建运行时结构
你的核心需求是把每一行的FactionName和ReputationValue封装成独立的Faction字典,再存入Factions数组。之前的代码问题在于没有正确提取行内的具体字段,而且要注意原JSON结构的键名大小写(比如是Sheets不是sheets)。
正确的解析代码如下(基于Godot语法):
var FactionArray = [] # 遍历所有工作表,定位到"Factions"表 for sheet in content["Sheets"]: if sheet["name"] == "Factions": # 遍历表内每一行数据 for line in sheet["lines"]: # 提取对应字段,封装为Faction字典 var faction = { "Name": line["FactionName"], "Reputation": line["ReputationValue"] } FactionArray.push_back(faction)
关键说明:
- 原JSON中
Sheets是大写开头,必须严格匹配,否则会找不到目标工作表 - 每个
line本身就是包含FactionName和ReputationValue的字典,直接通过键名取值即可,不需要复杂的删除操作 - 最终
FactionArray里的每个元素都是你需要的{Name: "派系名", Reputation: 声望值}结构,方便运行时调用
二、将修改后的派系数据回写至CDB文件
要保存回原文件,需要把运行时的FactionArray还原成CDB要求的JSON结构,再覆盖写入文件。核心是保留原CDB的完整结构(比如columns、separators等字段),只更新lines部分:
# 先找到要更新的"Factions"工作表 var target_sheet = null for sheet in content["Sheets"]: if sheet["name"] == "Factions": target_sheet = sheet break if target_sheet: # 清空原有行数据 target_sheet["lines"].clear() # 将运行时的Faction数据转换回CDB格式 for faction in FactionArray: var new_line = { "FactionName": faction["Name"], "ReputationValue": faction["Reputation"] } target_sheet["lines"].push_back(new_line) # 将修改后的整个数据结构转为JSON字符串 var updated_json = to_json(content) # 写入并覆盖原CDB文件 var file = File.new() if file.open(FactionDB, File.WRITE): file.store_string(updated_json) file.close() print("派系数据保存成功!") else: print("错误:无法打开文件进行写入")
注意事项:
- 必须保留原CDB的所有非
lines字段(比如columns、compress等),否则CastleDB编辑器可能无法正常打开文件 - 写入时使用
File.WRITE模式,会直接覆盖原文件内容,建议操作前备份原文件 - 如果你的声望值是数字类型,确保回写时不会变成字符串(Godot的
to_json会自动保留类型,只要你运行时没修改类型就没问题)
内容的提问来源于stack exchange,提问作者Intro verb
相关产品推荐
相关产品推荐

