我使用JSON.Net作为我的串行器在C#中大MVC 3 Web应用程序和Razor视图引擎。 例如,在一个视图中的初始页面加载,有使用脚本标签中倾倒大量的JSON @Html.Raw(JsonConvert.SerializeObject(myObject))
问题是,一些对象的一些值包含撇(思的名字,像奥布莱恩),这是JSON.Net不以任何方式逃避或编码。
这不是预先编码存储在数据库中,因为这大大各种其他处理,复杂的值的选项。
有没有办法迫使JSON.Net到HTML编码它系列化,该对象的值相同的方式,内置JavaScriptSerializer确实,当你调用JavaScriptSerializer.Serialize(myObject)
? 或者说,是有办法解决这个问题的看法?
虽然也有一些情况,其中,您可能希望将一些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<string>();
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; }
}
为了给所有字符串使用应用转换器:
JsonConvert.SerializeObject(person, Formatting.Indented, new EscapeQuoteConverter());
使用System.Web.HttpUtility.HtmlEncode
HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))