C#中用StringBuilder构建JSON遇双引号导致格式无效问题
问题描述
我做了个示例展示遇到的问题——用StringBuilder手动构建JSON时,一旦Model.Code字段包含双引号(比如示例里的123 "45"),生成的JSON就会格式无效。
public class Model { public string Name { get; set; } public string Code { get; set; } } List<Model> list = new List<Model>(); list.Add(new Model() { Name = "Test1", Code = "124565123" }); list.Add(new Model() { Name = "Test2", Code= "123 \"45" }); list.Add(new Model() { Name = "Test3", Code = "456" }); var sb = new StringBuilder(); sb.Append($"\"item_name\":\"{list[0].Name}\","); sb.Append($"\"item_id\":\"{list[0].Code}\","); sb.Append($"\"item_name\":\"{list[1].Name}\","); sb.Append($"\"item_id\":\"{list[1].Code}\","); sb.Append($"\"item_name\":\"{list[2].Name}\","); sb.Append($"\"item_id\":\"{list[2].Code}\","); return sb.ToString();
问题根源
手动拼接JSON字符串时,无法自动处理双引号、换行符、斜杠等特殊字符的转义逻辑。比如示例中Code = "123 \"45"会被直接拼为"item_id":"123 "45",这里的未转义双引号会直接打断JSON的结构,导致格式完全无效。
正确解决方案:使用官方JSON序列化库
绝对不要手动拼接JSON,直接使用.NET内置或成熟的第三方序列化工具,它们会自动处理所有特殊字符的转义,确保生成的JSON符合语法规范。
方案1:使用System.Text.Json(.NET Core 3.0+ 内置)
using System.Text.Json; // 先构造符合JSON结构的对象(这里用匿名类定义JSON的层级) var jsonData = new { items = list.Select(m => new { item_name = m.Name, item_id = m.Code }) }; // 序列化生成合法JSON string jsonString = JsonSerializer.Serialize(jsonData); return jsonString;
方案2:使用Newtonsoft.Json(第三方库,需通过NuGet安装)
using Newtonsoft.Json; var jsonData = new { items = list.Select(m => new { item_name = m.Name, item_id = m.Code }) }; string jsonString = JsonConvert.SerializeObject(jsonData); return jsonString;
特殊场景:手动转义单个字符串(不推荐)
如果确实有特殊需求需要手动处理单个字符串的转义,可以用以下方法,但仍强烈建议使用序列化库:
// System.Text.Json 转义单个字符串 string escapedCode = JsonEncodedText.Encode(list[1].Code).ToString(); sb.Append($"\"item_id\":\"{escapedCode}\",");
内容的提问来源于stack exchange,提问作者dodo
相关产品推荐
相关产品推荐

