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

Julia中如何高效修改JSON文件?求替代读删重写的方案

优化Julia中JSON文件追加更新的实现方式

首先你的现有代码存在作用域问题:在open("RayDictionary.txt","r") do file块内定义的d,在块外无法访问,执行merge!(d,newentry)会直接报错,先修复这个基础问题。

针对你的需求(保留历史结果,每次追加新条目到JSON对象),以下是几种更优的实现方式:

方式一:优化全量读写逻辑(最稳妥的对象更新方案)

因为JSON对象({...})的结构决定了无法直接在文件末尾追加键值对(会破坏JSON格式),所以必须读全量数据合并后重新写入,但可以简化IO操作,无需删除原文件:

using JSON

newentry = Dict(string(θ) => list[end].legs[2][1]/2.0)

# 处理文件不存在的情况,初始化空字典
if isfile("RayDictionary.txt")
    d = open(JSON.parse, "RayDictionary.txt", "r")
else
    d = Dict()
end

merge!(d, newentry)

# 直接用"w"模式覆盖写入,无需删除文件
open("RayDictionary.txt", "w") do file
    JSON.print(file, d, 2)
end

方式二:改用JSON数组结构实现真正的追加(适合条目独立的场景)

如果你的计算结果可以组织为数组元素(而非对象的键值对),可以直接在文件末尾追加内容,避免全量读取,性能更优:

初始化文件(首次运行)

open("RayArray.txt", "w") do file
    JSON.print(file, [], 2)
end

每次追加新条目

using JSON

newentry = list[end].legs[2][1]/2.0  # 单个结果或自定义结构

open("RayArray.txt", "r+") do file
    # 移动到文件倒数第二个字符(跳过数组末尾的"]")
    seekend(file)
    skip(file, -1)
    
    # 处理是否是第一个元素
    if position(file) == 0
        # 文件为空,直接写入第一个元素
        JSON.print(file, [newentry], 2)
    else
        # 追加逗号和新元素,再补"]"
        write(file, ",\n  ")
        JSON.print(file, newentry)
        write(file, "\n]")
    end
end

方式三:使用性能更优的JSON库

如果处理的数据集较大,推荐使用JSON3.jl替代JSON.jl,它的解析和序列化速度更快,逻辑和上面一致:

using JSON3

newentry = Dict(string(θ) => list[end].legs[2][1]/2.0)

d = isfile("RayDictionary.txt") ? JSON3.read(read("RayDictionary.txt"), Dict) : Dict()
merge!(d, newentry)

write("RayDictionary.txt", JSON3.pretty(d))

内容的提问来源于stack exchange,提问作者jephwack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:25:14