如何在Julia中将JSON转为参数化嵌套struct及相关报错解决
报错原因
- 构造函数定义错误:你定义
struct_A的内部构造函数时,函数名错误写为BatteryStorage,导致struct_A没有符合预期的可调用构造方法,无法接收传入的Dict参数完成实例化。 - JSON结构不匹配:你解析得到的
jsonDict最外层包含struct_A键,直接将整个Dict传入转换方法时,Dict的键与struct_A的字段arg1、arg2无法对应。 - 嵌套类型无映射规则:转换工具默认不知道
struct_A的参数化类型T对应实际的struct_B类型,也不会自动将嵌套的Dict转换为子struct实例。 - 父类型未定义:你声明
struct_B <: myStruct但没有提前定义myStruct这个抽象父类型,本身就存在语法隐患。
正确实现方案
这里以适配性更好的JSON3+StructTypes组合为例,可直接支持参数化嵌套struct的转换,完整可运行代码如下:
# 导入依赖 using JSON3, StructTypes # 先定义缺失的抽象父类型 abstract type myStruct end # 定义子struct struct struct_B <: myStruct arg_B::Int end # 定义参数化父struct,不要写错构造函数名 struct struct_A{T<:myStruct} <: myStruct arg1::T arg2::Int end # 为自定义struct开启自动转换支持 StructTypes.StructType(::Type{<:struct_B}) = StructTypes.Struct() StructTypes.StructType(::Type{<:struct_A}) = StructTypes.Struct() # 测试JSON stringtest="""{ "struct_A": { "arg1": { "arg_B": 90 }, "arg2": 100 } }""" # 解析JSON并转换,先取到struct_A对应的内层内容再转换 json_data = JSON3.read(stringtest) result = StructTypes.constructfrom(struct_A, json_data.struct_A) # 验证结果 @assert result.arg1.arg_B == 90 @assert result.arg2 == 100 @assert result isa struct_A{struct_B}
如果你要继续使用ToStruct包,修改以下几点即可:
- 把
struct_A的内部构造函数名从BatteryStorage改为struct_A - 转换前先提取JSON内层内容:
inner_dict = jsonDict["struct_A"] - 明确指定参数化类型调用转换:
to_struct = ToStruct.tostruct(struct_A{struct_B}, inner_dict)
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

