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
相关产品推荐
相关产品推荐

