Godot 4中遍历自定义类数组并转JSON存文件的问题求助
Godot 4自定义类数组数据提取与JSON序列化问题
我使用Godot 4开发,最终目标是将自定义类数组的数据转换为JSON并保存到文件,但无法正确提取数组中自定义类的属性数据。
自定义类定义
extends Node class_name BusinessType var location = Vector2(0,0) var appeal : int var products var startDay : int
全局变量定义(Global.gd)
var businesses : Array[BusinessType] = []
尝试的代码片段
func save_file(): var myBus = BusinessType.new() var myBusName = "Random Name " myBus.name=myBusName myBus.appeal=randi_range(0,100) Global.businesses.append(myBus) var busData_json = JSON.stringify(Global.businesses) for i in Global.businesses.size(): print("\n".join(Global.businesses))
期望与实际输出
- 期望输出:
Random Name , location : (0, 0), appeal : 45
- 实际输出:
Random Name :<Node#31155291392>
解决方法
1. 正确打印自定义类的属性数据
直接打印BusinessType实例时,Godot会输出Node类的默认格式(名称+节点ID),想要输出目标格式可以用以下两种方式:
方式一:手动拼接属性字符串
在循环中逐个访问实例属性并拼接成目标格式:
for bus in Global.businesses: print(f"{bus.name}, location : ({bus.location.x}, {bus.location.y}), appeal : {bus.appeal}")
方式二:重写_to_string方法
在BusinessType类中添加_to_string方法,自定义实例的字符串输出格式:
extends Node class_name BusinessType var location = Vector2(0,0) var appeal : int var products var startDay : int func _to_string() -> String: return f"{name}, location : ({location.x}, {location.y}), appeal : {appeal}"
之后直接打印实例或使用join就能得到期望格式:
print("\n".join(Global.businesses))
2. 将自定义类数组转换为JSON
由于BusinessType继承自Node,默认JSON.stringify只会序列化Node的内置属性,无法识别自定义字段,需要通过以下方案处理:
方案一:实现_to_json方法
在BusinessType类中添加_to_json方法,返回包含所有需要序列化属性的字典(注意Vector2需转成数组才能被JSON识别):
func _to_json() -> String: var data = { "name": name, "location": [location.x, location.y], "appeal": appeal, "products": products, "startDay": startDay } return JSON.stringify(data)
之后调用JSON.stringify(Global.businesses)即可得到正确的JSON字符串。
方案二:手动转换为字典数组
如果不想修改BusinessType类,可在保存时将每个实例转为字典再序列化:
func save_file(): var myBus = BusinessType.new() var myBusName = "Random Name " myBus.name=myBusName myBus.appeal=randi_range(0,100) Global.businesses.append(myBus) # 将自定义类数组转为字典数组 var bus_dicts = [] for bus in Global.businesses: bus_dicts.append({ "name": bus.name, "location": [bus.location.x, bus.location.y], "appeal": bus.appeal, "products": bus.products, "startDay": bus.startDay }) var busData_json = JSON.stringify(bus_dicts) # 后续可将busData_json写入文件
内容的提问来源于stack exchange,提问作者Easy Cap
相关产品推荐
相关产品推荐

