我使用JSON.Net作为c#中的大型MVC 3 Web应用程序和Razor视图引擎的序列化程序。对于一个视图中的初始页面加载,使用@Html.Raw(JsonConvert.SerializeObject(myObject))
在脚本标记内转储了大量JSON。
问题是某些对象的某些值包含撇号(想想像O'Brien这样的名字),JSON.Net没有以任何方式转义或编码。
预编码存储在数据库中的值不是一种选择,因为这会使各种其他进程复杂化。
有没有办法强制JSON.Net对HTML序列化对象的值进行编码,就像调用JavaScriptSerializer.Serialize(myObject)
时内置JavaScriptSerializer所做的那样?或者,有没有办法在视图中处理这个?
答案 0 :(得分:25)
JsonSerializerSettings settings = new JsonSerializerSettings
{
StringEscapeHandling = StringEscapeHandling.EscapeHtml
};
JsonConvert.SerializeObject(obj, settings);
答案 1 :(得分:16)
您可以像这样创建自定义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; }
}
要将Converter应用于所有字符串,请使用:
JsonConvert.SerializeObject(person, Formatting.Indented, new EscapeQuoteConverter());
答案 2 :(得分:14)
虽然在某些情况下您可能希望将某些JSON作为JavaScript字符串或HTML属性值放入页面中,但通常您只需将其直接包含在JavaScript源代码中,因为JSON有效毕竟是JavaScript语法。
答案 3 :(得分:3)
使用System.Web.HttpUtility.HtmlEncode
HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))