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

C#使用Newtonsoft.Json处理NinjaTrader数据生成指定JSON格式咨询

你当前的问题是每次都对只包含单条数据的List<DataFormat>做序列化,所以输出结果必然自带[]包裹,追加写入后就会出现多组独立数组,不符合预期。以下是对应两种目标格式的最优实现方案:

方案1:输出标准单JSON数组格式(所有数据包裹在一对[]中)

适用场景A:程序持续运行、无中途重启需求

全局维护唯一的List<DataFormat>实例,所有新数据追加到这个全局实例中,全部采集完成后一次性序列化写入即可,性能最优:

// 全局定义,不要放在每分钟执行的写入逻辑中
private List<DataFormat> _allData = new List<DataFormat>();

// 每分钟执行的新增数据逻辑
_allData.Add(new DataFormat()
{
    Date = Time[0],
    PriceChange = Close[0] - Open[0],
    RSI = RSI(20, 3)[0],
    Momentum = Momentum(20)[0],
    MACD = MACD(12, 26, 9)[0]
});

// 所有数据采集完成后,仅执行一次写入
string fullJson = JsonConvert.SerializeObject(_allData, Formatting.Indented);
File.WriteAllText(path, fullJson);

适用场景B:程序可能中途退出、需要增量追加到已有文件

每次写入时处理原有文件的首尾括号即可:

var newItem = new DataFormat()
{
    Date = Time[0],
    PriceChange = Close[0] - Open[0],
    RSI = RSI(20, 3)[0],
    Momentum = Momentum(20)[0],
    MACD = MACD(12, 26, 9)[0]
};
string itemJson = JsonConvert.SerializeObject(newItem, Formatting.Indented);

if (!File.Exists(path) || new FileInfo(path).Length == 0)
{
    // 首次写入,添加数组开头的[
    using var sw = File.CreateText(path);
    sw.WriteLine("[");
    sw.WriteLine(itemJson);
    sw.WriteLine("]");
}
else
{
    // 已有内容,先移除末尾的],追加新元素后再补回]
    var allLines = File.ReadAllLines(path).ToList();
    if (allLines.Last().Trim() == "]") allLines.RemoveAt(allLines.Count - 1);
    // 给上一条数据末尾补逗号
    if (allLines.Count > 1 && !allLines.Last().TrimEnd().EndsWith(","))
    {
        allLines[allLines.Count - 1] = allLines.Last().TrimEnd() + ",";
    }
    allLines.Add(itemJson);
    allLines.Add("]");
    File.WriteAllLines(path, allLines);
}
方案2:输出无[]包裹的逗号分隔JSON对象序列

该方案不需要读写全量文件,增量写入性能更高,适合数据量较大的场景:

var newItem = new DataFormat()
{
    Date = Time[0],
    PriceChange = Close[0] - Open[0],
    RSI = RSI(20, 3)[0],
    Momentum = Momentum(20)[0],
    MACD = MACD(12, 26, 9)[0]
};
string itemJson = JsonConvert.SerializeObject(newItem, Formatting.Indented);

using var sw = File.AppendText(path);
// 非首次写入,先加逗号分隔上一条数据
if (new FileInfo(path).Length > 0)
{
    sw.WriteLine(",");
}
sw.Write(itemJson);

补充说明

如果可以接受不带逗号的每行一个JSON对象(即JSON Lines格式,绝大多数数据处理工具都原生支持),代码可以更简化,不需要判断文件状态,每次直接序列化单个对象后追加写入即可,适合TB级行情数据的持久化场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:18:02