使用JSON.Net序列化包含撇号的字符串

我使用JSON.Net作为c#中的大型MVC 3 Web应用程序和Razor视图引擎的序列化程序。 对于一个视图中的初始页面加载,使用@Html.Raw(JsonConvert.SerializeObject(myObject))在脚本标记内转储了大量JSON。

问题是某些对象的某些值包含撇号(想想像O’Brien这样的名字),JSON.Net没有以任何方式转义或编码。

对预存储在数据库中的值进行预编码不是一种选择,因为这会使各种其他进程复杂化。

有没有办法强制JSON.Net对HTML序列化对象的值进行编码,就像调用JavaScriptSerializer.Serialize(myObject)时内置的JavaScriptSerializer一样? 或者,有没有办法在视图中处理这个问题?

虽然在某些情况下您可能希望将某些JSON作为JavaScript字符串或HTML属性值放入页面中,但大多数情况下您只需将其直接包含在JavaScript源代码中,因为JSON之后是有效的JavaScript语法所有。

 JsonSerializerSettings settings = new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml }; JsonConvert.SerializeObject(obj, settings); 

您可以像这样创建自定义JsonConverter:

 public class EscapeQuoteConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(value.ToString().Replace("'", "\\'")); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var value = JToken.Load(reader).Value(); return value.Replace("\\'", "'"); } public override bool CanConvert(Type objectType) { return objectType == typeof(string); } } 

要仅将此属性用于Name属性,请按属性指定:

 public class Person { [JsonConverter(typeof(EscapeQuoteConverter))] public string Name { get; set; } } 

要将Converter应用于所有字符串,请使用:

 JsonConvert.SerializeObject(person, Formatting.Indented, new EscapeQuoteConverter()); 

使用System.Web.HttpUtility.HtmlEncode

 HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))