JSON数组能否故意重复条目?如何用C#实现发货标签数据重复功能
问题解答
可行性说明
这种操作完全可以在JSON数组中实现。JSON数组本身是有序的元素集合,支持按自定义顺序插入元素,完全满足你「原条目在前、复制的相同条目紧跟在后方」的需求。
注意事项
你提供的伪代码存在判断顺序的逻辑问题:现有逻辑中x>840的分支永远不会触发,因为840满足x>=48的前置判断,需要调整判断优先级,把数值最大的区间判断放在最前面。
修正后的判断规则如下:
- 当
PackagingCount > 840时,固定生成14份标签 - 当
48 ≤ PackagingCount ≤ 840时,按PackagingCount/60向上取整计算标签份数 - 当
PackagingCount < 48时,按PackagingCount/12向上取整计算标签份数
C# 实现代码
假设你使用的是Newtonsoft.Json处理JSON数据(绝大多数报表构建工具的C#环境默认集成该类库),参考代码如下:
using Newtonsoft.Json.Linq; using System; // 放在DoBeforeYouPrint方法内的逻辑 public void DoBeforeYouPrint() { // 替换为你实际从报表上下文获取的原始JSON数据源 JArray originalDataSource = 你的报表原始数据源对象 as JArray; JArray newDataSource = new JArray(); foreach (JObject entry in originalDataSource) { // 将字符串类型的PackagingCount转为整数 if (!int.TryParse(entry["PackagingCount"]?.ToString(), out int packagingCount)) { // 异常场景:如果PackagingCount不是合法数字,默认保留1份 newDataSource.Add(new JObject(entry)); continue; } int copyCount; // 按修正后的规则计算份数 if (packagingCount > 840) { copyCount = 14; } else if (packagingCount >= 48) { copyCount = (int)Math.Ceiling((double)packagingCount / 60); } else { copyCount = (int)Math.Ceiling((double)packagingCount / 12); } // 按份数复制条目,按顺序加入新数据源 for (int i = 0; i < copyCount; i++) { // 深拷贝条目,避免修改一个条目影响其他重复项 JObject duplicatedEntry = new JObject(entry); newDataSource.Add(duplicatedEntry); } } // 将新生成的数据源替换回报表对象 你的报表对象.DataSource = newDataSource; }
额外说明
- 如果你的报表工具用的是System.Text.Json处理JSON,逻辑完全一致,仅JSON操作类的API有细微差别,替换对应写法即可
- 代码中增加了非法数值的容错处理,避免因脏数据导致报表打印失败
- 生成的新JSON数组顺序完全符合你的要求,每个原条目后方紧跟对应数量的完全相同的复制条目,报表工具可直接识别打印
内容的提问来源于stack exchange,提问作者Arne Richardsen
相关产品推荐
相关产品推荐

