You need to enable JavaScript to run this app. C#中如何实现向JSON值传入变量(参考Python占位符替换用法)
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何实现向JSON值传入变量(参考Python占位符替换用法)

C# 实现JSON占位符变量替换的方案

你要实现的效果可以拆解为两个核心步骤,和Python的实现逻辑完全对齐:

  1. 匹配JSON模板中的占位符,用传入的变量值完成替换
  2. 将替换完成的字符串反序列化为可直接使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 00:36:04