我使用JSON.Net作为c#和Razor视图引擎中一个大型MVC3Web应用程序的序列化程序。对于一个视图中的初始页面加载,使用@Html.Raw(JsonConvert.SerializeObject(myObject))
将大量JSON转储到脚本标记中。
问题是一些对象的一些值包含撇号(比如O‘’Brien这样的名字),JSON.Net不会以任何方式对其进行转义或编码。
不能选择对存储在数据库中的值进行预编码,因为这会使其他各种过程变得非常复杂。
有没有办法强制JSON.Net对它序列化的对象的值进行超文本标记语言编码,就像调用JavaScriptSerializer.Serialize(myObject)
时内置的JavaScriptSerializer所做的那样?或者,有没有办法在视图中处理这个问题?
发布于 2012-08-21 07:01:17
尽管在某些情况下,您可能希望将一些JSON作为JavaScript字符串或HTML属性值放到页面中,但大多数情况下,您要做的只是将其直接包含到JavaScript源代码中,因为JSON毕竟是有效的JavaScript语法。
发布于 2015-01-09 19:41:09
JsonSerializerSettings settings = new JsonSerializerSettings
{
StringEscapeHandling = StringEscapeHandling.EscapeHtml
};
JsonConvert.SerializeObject(obj, settings);
发布于 2012-08-21 02:24:34
您可以像这样创建自定义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());
https://stackoverflow.com/questions/12042302
复制相似问题