You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:26:12