C#如何根据输入JSON指定的字段顺序生成目标文本文件
C# 基于JSON配置动态控制Txt输出字段顺序实现方案
核心实现逻辑
整个方案完全解耦排序规则和业务代码,后续调整顺序只改JSON即可,核心流程分三步:
- 第一步:读取JSON配置的字段排序映射
- 第二步:将业务数据统一转换为字段名-值的字典结构,避免硬编码字段
- 第三步:按配置的排序规则动态排列字段后拼接写入Txt
具体实现代码
1. 定义JSON配置文件
在项目中新建配置文件(比如fieldConfig.json,设置文件属性为「如果较新则复制到输出目录」),配置内容格式如下:
{ "FieldSortMap": { "ID": 1, "Name": 2, "Value": 3 } }
配置里key和业务类的属性名对应,value是排序权重,数值越小输出时位置越靠前。
2. 通用配置读取与数据转换逻辑
首先定义配置对应的实体类,再写个通用的对象转字典方法,用反射自动读取所有属性值,不需要手动写每个字段的映射:
using System.Reflection; using System.Text.Json; // 配置实体类 public class OutputFieldConfig { // 配置读取时设置不区分key大小写,避免配置大小写和属性名不匹配报错 public Dictionary<string, int> FieldSortMap { get; set; } = new(StringComparer.OrdinalIgnoreCase); } // 通用对象转属性字典方法 public Dictionary<string, object> ConvertToPropertyDict(object data) { var result = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); if (data == null) return result; foreach (PropertyInfo prop in data.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { result[prop.Name] = prop.GetValue(data); } return result; }
3. 动态排序并生成Txt
核心逻辑里完全不写死字段顺序,所有排序依据都来自读取到的配置:
// 程序启动时加载配置,实际项目可以做配置热更新,改完JSON不用重启 var configContent = File.ReadAllText("fieldConfig.json"); var fieldConfig = JsonSerializer.Deserialize<OutputFieldConfig>(configContent) ?? throw new InvalidOperationException("字段配置文件读取失败"); // 模拟你的业务数据源,实际替换成你从输入文件解析得到的数据集合 List<YourBusinessData> dataList = GetInputData(); // 逐行生成输出内容 var outputLines = new List<string>(); foreach (var dataItem in dataList) { var propDict = ConvertToPropertyDict(dataItem); // 按配置的权重升序排列字段,未在配置中声明的字段默认不输出 var sortedFieldNames = propDict.Keys .Where(fieldConfig.FieldSortMap.ContainsKey) .OrderBy(fieldName => fieldConfig.FieldSortMap[fieldName]) .ToList(); // 拼接行内容,分隔符可以根据需求换成逗号、空格等 var lineContent = string.Join("\t", sortedFieldNames.Select(name => propDict[name]?.ToString() ?? "")); outputLines.Add(lineContent); } // 写入最终Txt文件 File.WriteAllLines("output.txt", outputLines); // 你的业务数据类示例 public class YourBusinessData { public int ID { get; set; } public string Name { get; set; } public decimal Value { get; set; } }
后续调整方式
如果需要修改字段输出顺序,比如要把Value放到第一列、ID放到最后一列,只需要修改JSON配置即可,不需要改动任何C#代码:
{ "FieldSortMap": { "ID": 3, "Name": 2, "Value": 1 } }
如果需要新增输出字段,只要在YourBusinessData类里新增对应属性,同时在JSON配置里给新字段加排序权重即可,核心生成逻辑完全不用改。
可选优化项
- 可以加启动校验:程序启动时检查业务类的所有公开属性是否都在配置的
FieldSortMap中存在,缺项直接抛出明确异常,避免漏输出字段。 - 如果需要自定义字段输出格式(比如日期格式、数字保留小数位),可以把配置结构扩展为包含
Sort、Format两个属性的对象,在拼接值的时候自动按配置格式化,扩展性更强。 - 可以加配置文件监听,实现配置热更新,修改JSON后不需要重启程序,下次生成文件自动用新的排序规则。
内容的提问来源于stack exchange,提问作者alekbay
相关产品推荐
相关产品推荐

