You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server存储带{}参数的JSON并在非.NET Core的C#中使用

最佳实现方案:SQL Server存储带参数的JSON及C#服务使用

一、SQL Server存储方案

1. 存储类型选择

  • 若使用SQL Server 2016及以上版本,优先用JSON类型:它会自动验证JSON格式合法性,避免脏数据,还支持JSON_VALUE、JSON_MODIFY等JSON专属查询函数。
  • 老版本SQL Server用NVARCHAR(MAX):无存储大小限制,但需自行保证JSON格式正确,建议存入前在代码中做格式校验。

2. JSON结构优化

建议把序号占位符(如{0})改成命名占位符(如{Price}),示例:

[{"Title" : "abcdef", "Content" :"ghi1234", "Type" :1, "Price" :"{Price}"}]

这样后续替换时更直观,不会因参数顺序混淆导致错误。

二、非.NET Core/非MVC C#服务中的使用方案

思路1:强类型反序列化+参数替换(推荐)

先将JSON反序列化为C#对象,逐个替换占位符后再序列化回JSON,安全且易维护。

步骤&代码示例:

  1. 定义对应JSON结构的实体类:
public class UITemplate
{
    public string Title { get; set; }
    public string Content { get; set; }
    public int Type { get; set; }
    public string Price { get; set; }
}
  1. 读取并处理:
// 从数据库读取原始JSON字符串(假设已通过数据访问层获取)
string rawJson = GetTemplateFromDatabase();

// 反序列化为对象列表
List<UITemplate> templates = Newtonsoft.Json.JsonConvert.DeserializeObject<List<UITemplate>>(rawJson);

// 替换参数(示例:传入目标价格)
decimal targetPrice = 199.99m;
foreach (var template in templates)
{
    // 命名占位符替换,逻辑清晰不易错
    template.Price = template.Price.Replace("{Price}", targetPrice.ToString("N2"));
    // 若用序号占位符,可使用:string.Format(template.Price, targetPrice)
}

// 序列化回JSON返回给UI
string processedJson = Newtonsoft.Json.JsonConvert.SerializeObject(templates);
return processedJson;

优势:强类型校验避免字段错误,替换逻辑清晰,易扩展。

思路2:直接字符串替换(适合简单场景)

如果JSON结构简单,且占位符不会出现在非参数位置,可直接在原始JSON字符串上替换:

string rawJson = GetTemplateFromDatabase();
decimal targetPrice = 199.99m;
// 替换命名占位符
string processedJson = rawJson.Replace("{Price}", targetPrice.ToString("C"));
// 或替换序号占位符:rawJson.Replace("{0}", targetPrice.ToString("C"))
return processedJson;

优势:代码简洁,无需定义实体类;缺点:存在误替换风险(比如文本内容刚好包含{0})。

思路3:模板引擎处理(适合复杂模板)

如果模板需要支持复杂逻辑(如条件判断、循环),可使用第三方模板引擎(比如RazorEngine,非MVC环境也能使用):

  1. 先将JSON改成Razor模板格式:
[{"Title" : "abcdef", "Content" :"ghi1234", "Type" :1, "Price" :"@Model.Price"}]
  1. C#代码处理:
string rawTemplate = GetTemplateFromDatabase();
// 定义参数模型
var model = new { Price = 199.99m.ToString("N2") };
// 解析模板生成最终JSON
string processedJson = RazorEngine.Razor.Parse(rawTemplate, model);
return processedJson;

优势:支持复杂逻辑,扩展性强;缺点:需要引入第三方库,学习成本略高。

思路4:SQL Server端替换(不推荐)

可以在SQL查询时直接替换占位符,但灵活性差,仅适合极简单场景:

-- 使用参数化查询避免注入风险
DECLARE @Price NVARCHAR(20) = '199.99'
SELECT REPLACE(template, '{Price}', @Price) AS processed_template
FROM MyTable

优势:C#端无需处理;缺点:多参数时需嵌套REPLACE,易出错,无法处理复杂逻辑。

三、最佳实践总结

  1. 存储优先用SQL Server JSON类型,保证格式合法性;
  2. 推荐用命名占位符代替序号占位符,降低出错概率;
  3. 常规场景选「强类型反序列化+参数替换」,兼顾安全与可维护性;
  4. 复杂模板场景考虑引入模板引擎;简单场景可直接字符串替换。

内容的提问来源于stack exchange,提问作者Büşra Altun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:00:59