关于使用JULIA新建JSON数据库的问题

目前我的代码是这样的,但是不知道为什么,每次一录入完JSON数据库的第一条数据之后想要再次录入数据时就会报错,问一下这是因为什么原因?

using JSON3    
  
struct 素材  
    文件名::String  
    编号::String  
    文件类型::String  
    细分文件类型::String  
    作者或发布者::String  
    本地存储路径::String  
    云端备份路径::String  
    密码::String  
end  
  
  
function 素材_to_dict(素材对象::素材)  
    return Dict(  
        "文件名" => 素材对象.文件名,  
        "编号" => 素材对象.编号,  
        "文件类型" => 素材对象.文件类型,  
        "细分文件类型" => 素材对象.细分文件类型,  
        "作者或发布者" => 素材对象.作者或发布者,  
        "本地存储路径" => 素材对象.本地存储路径,  
        "云端备份路径" => 素材对象.云端备份路径,  
        "密码" => 素材对象.密码  
    )  
end  
  
  
function 获取素材信息()  
    println("请输入文件名:")
    文件名 = readline()
    println("请输入编号:")  
    编号 = readline()
    println("请输入文件类型:")
    文件类型 = readline()  
    println("请输入细分文件类型:")
    细分文件类型 = readline()
    println("请输入作者或发布者:")  
    作者或发布者 = readline()
    println("请输入本地存储路径:")  
    本地存储路径 = readline()
    println("请输入云端备份路径:")  
    云端备份路径 = readline()  
    println("请输入密码(注意:此密码将以明文形式存储在JSON文件中,请谨慎处理):")
    密码 = readline()  
    return 素材(文件名, 编号, 文件类型, 细分文件类型, 作者或发布者, 本地存储路径, 云端备份路径, 密码)  
end  
  
  
function main()  
      
    新素材 = 获取素材信息()  
      
      
    json_文件路径 = "素材.JSON"  
      
      
    if isfile(json_文件路径)  
        json_str = read(json_文件路径, String)  
        现有素材列表 = JSON3.read(json_str) :: Vector{Dict{String, Any}}  
    else
        现有素材列表 = Vector{Dict{String, Any}}()  
    end  
      
     
    push!(现有素材列表, 素材_to_dict(新素材))  
      
      
    open(json_文件路径, "w") do 文件  
        JSON3.write(文件, 现有素材列表, pretty=true)  
    end  
      
    println("新素材已成功添加到数据库中。")  
end  
    
main()

报错信息一直是这样的,找不到原因:

 LoadError: TypeError: in typeassert, expected Vector{Dict{String, Any}}, got a value of type JSON3.Array{JSON3.Object, Base.CodeUnits{UInt8, String}, Vector{UInt64}}
Stacktrace:
 [1] main()
   @ Main E:\JsonDatabase\JuliaInputTest\AppendResources.jl:61
 [2] top-level scope
   @ E:\JsonDatabase\JuliaInputTest\AppendResources.jl:78

中文编程。。。辣眼睛…

把代码用 ``` 包围一下吧,排版看着很乱。

简化问题的代码,你想表达的应该是 JSON 转化问题:

if isfile(json_文件路径)
    json_str = read(json_文件路径, String)
    现有素材列表 = JSON3.read(json_str) :: Vector{Dict{String, Any}}
else
    现有素材列表 = Vector{Dict{String, Any}}()
end

尽量贴最小复现例子:JSON3.read("""[{"a":"b"}]""")::Vector{Dict{String, Any}}

可以用 debug 模式,定位错误:

正常写法可以这样:

现有素材列表 = [Dict{String, Any}(string(key)=>val for (key, val) in obj) for obj in JSON3.read(json_str)]

JSON3.read 返回是 symbol=>string,暂不支持直接转化:JSON3 to mutable Dict{String,Any} - General Usage - Julia Programming Language

大佬,继续向您询问一下,我对JSON数据库和Julia的组合不太熟悉,julia好像不能将JSON中的数据直接读出来,而是要将JSON数据库中的字符串转化为Dict{String, Any}类型才能使用,这是为什么?

What Is A JSON Database? | All You Need To Know | MongoDB | MongoDB

felipenoris/Mongoc.jl: MongoDB driver for the Julia Language (github.com)

因为你现在做的和数据库还没什么关系