如何在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,安全且易维护。
步骤&代码示例:
- 定义对应JSON结构的实体类:
public class UITemplate { public string Title { get; set; } public string Content { get; set; } public int Type { get; set; } public string Price { get; set; } }
- 读取并处理:
// 从数据库读取原始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环境也能使用):
- 先将JSON改成Razor模板格式:
[{"Title" : "abcdef", "Content" :"ghi1234", "Type" :1, "Price" :"@Model.Price"}]
- 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,易出错,无法处理复杂逻辑。
三、最佳实践总结
- 存储优先用SQL Server
JSON类型,保证格式合法性; - 推荐用命名占位符代替序号占位符,降低出错概率;
- 常规场景选「强类型反序列化+参数替换」,兼顾安全与可维护性;
- 复杂模板场景考虑引入模板引擎;简单场景可直接字符串替换。
内容的提问来源于stack exchange,提问作者Büşra Altun
相关产品推荐
相关产品推荐

