C#中如何实现向JSON值传入变量(参考Python占位符替换用法)
C# 实现JSON占位符变量替换的方案
你要实现的效果可以拆解为两个核心步骤,和Python的实现逻辑完全对齐:
- 匹配JSON模板中的占位符,用传入的变量值完成替换
- 将替换完成的字符串反序列化为可直接使用的JSON对象
方案1:兼容Python %(变量名)s 占位符写法(零依赖)
如果你希望完全复用Python时代写好的JSON模板(也就是保留"%(user_name)s"的占位符语法,不改动原有模板),可以用正则匹配实现替换,不需要引入任何第三方组件:
- 首先写通用的模板渲染辅助类,内置和Python格式一致的占位符匹配规则
- 替换完成后直接用.NET内置的
System.Text.Json做反序列化即可
辅助类代码:
using System.Text.Json; using System.Text.RegularExpressions; public static class JsonTemplateRenderer { // 编译期正则,匹配 %(key)s 格式的Python风格占位符 private static readonly Regex PlaceholderPattern = new Regex( @"%\((?<key>\w+)\)s", RegexOptions.Compiled ); /// <summary> /// 渲染JSON模板,替换占位符后反序列化为目标类型 /// </summary> /// <typeparam name="T">要返回的JSON对象类型</typeparam> /// <param name="jsonTemplate">原始JSON模板字符串</param> /// <param name="variables">占位符和对应值的字典</param> public static T Render<T>(string jsonTemplate, Dictionary<string, object> variables) { var renderedContent = PlaceholderPattern.Replace(jsonTemplate, match => { var placeholderKey = match.Groups["key"].Value; // 匹配到对应变量就返回值,匹配不到就保留原占位符避免替换异常 return variables.TryGetValue(placeholderKey, out var value) ? value?.ToString() : match.Value; }); return JsonSerializer.Deserialize<T>(renderedContent)!; } }
实际使用示例,和你Python的逻辑完全一一对应:
// 原始JSON模板,和Python里的写法完全一致 const string jsonTemplate = """ { "path_to_file": "/Users/%(user_name)s/path/" } """; // 传入需要替换的变量 var replaceVariables = new Dictionary<string, object> { ["user_name"] = "my_test_user" }; // 等价于Python的 json.loads(file.read() % {"user_name": my_user_name}) var renderedJson = JsonTemplateRenderer.Render<JsonDocument>(jsonTemplate, replaceVariables); // 读取替换后的值:最终得到的路径是 /Users/my_test_user/path/ var finalPath = renderedJson.RootElement.GetProperty("path_to_file").GetString();
方案2:使用C#原生语法实现(开发效率更高)
如果不需要严格兼容Python的占位符语法,直接用C#原生的字符串插值特性即可,不需要额外写辅助类:
string myUserName = "my_test_user"; // 直接在C#代码中构建带变量的JSON对象 var renderedJson = new { path_to_file = $"/Users/{myUserName}/path/" }; // 序列化为标准JSON字符串,和模板渲染的效果一致 string jsonContent = JsonSerializer.Serialize(renderedJson);
注意事项
- 特殊字符处理:如果传入的变量值包含双引号、反斜杠等会破坏JSON结构的特殊字符,直接在字符串层面替换会导致JSON语法错误,需要在替换前对值做JSON格式的转义。
- 对于简单的单值替换场景,以上零依赖的实现完全可以满足需求,不需要额外引入JSON模板引擎类的第三方组件。
内容的提问来源于stack exchange,提问作者user13087636
相关产品推荐
相关产品推荐

