无需自定义逻辑与POCO,基于配置实现EventA到EventB的JSON转换可行吗?
实现通用的EventA到EventB数据生成函数
核心思路
要满足无POCO依赖、无硬编码转换逻辑、配置驱动的需求,可借助JSON动态处理库结合字符串模板替换实现,核心步骤如下:
- 将EventA和配置JSON解析为可动态访问的节点
- 遍历配置字段,识别
${JSON路径}格式的占位符,从EventA中提取对应路径的值完成替换 - 将处理后的配置节点序列化为最终的EventB JSON
代码实现(基于Newtonsoft.Json)
using Newtonsoft.Json.Linq; using System.Text.RegularExpressions; public static string GenerateEventData(string eventAData, string configJson) { // 解析EventA与配置为动态JSON节点 var eventA = JObject.Parse(eventAData); var config = JObject.Parse(configJson); // 匹配${xxx}格式的占位符 var placeholderPattern = new Regex(@"\${([^}]+)}", RegexOptions.Compiled); // 遍历配置中的所有属性 foreach (var prop in config.Properties()) { if (prop.Value.Type == JTokenType.String) { string template = prop.Value.ToString(); // 替换所有占位符 string processedValue = placeholderPattern.Replace(template, match => { // 提取JSON路径,例如"Address.PIN" string targetPath = match.Groups[1].Value; // 从EventA中获取对应路径的值 var targetValue = eventA.SelectToken(targetPath); return targetValue?.ToString() ?? string.Empty; }); prop.Value = processedValue; } } // 序列化为最终的EventB JSON return config.ToString(); }
示例验证
用你提供的测试数据验证功能:
// 输入EventA数据 string eventAData = @"{""Title"": ""MyTitle"", ""Address"": {""PIN"": ""123""}}"; // 输入配置文件内容 string config = @"{""NewTitle"": ""Generated ${Title}"", ""PIN"": ""000${Address.PIN}"", ""Country"": ""US""}"; // 生成EventB string eventB = GenerateEventData(eventAData, config); // 输出结果:{"NewTitle":"Generated MyTitle","PIN":"000123","Country":"US"}
特性说明
- 无POCO依赖:全程使用动态JSON节点处理,无需定义任何实体类
- 配置驱动:修改EventA的字段结构或EventB的输出格式,仅需更新config.json,无需修改函数代码
- 支持嵌套路径:通过
SelectToken可处理任意层级的JSON路径(如Address.PIN) - 容错处理:若EventA中不存在配置指定的路径,占位符会被替换为空字符串,避免抛出异常
扩展提示
- 若需处理非字符串类型字段(如数字、布尔值),可扩展逻辑判断JToken类型,直接赋值而非字符串替换
- 若使用System.Text.Json,可替换为
JsonDocument和JsonElement实现类似动态访问功能
内容的提问来源于stack exchange,提问作者RKS
相关产品推荐
相关产品推荐

