21

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

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

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

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

4

4 回答 4

30
JsonSerializerSettings settings = new JsonSerializerSettings
{
    StringEscapeHandling = StringEscapeHandling.EscapeHtml
};

JsonConvert.SerializeObject(obj, settings);
于 2015-01-09T11:41:09.010 回答
18

尽管在某些情况下,您可能希望将一些 JSON 作为 JavaScript 字符串或 HTML 属性值放入您的页面,但通常您要做的只是将其直接包含到 JavaScript 源代码中,因为 JSON 在之后是有效的 JavaScript 语法全部。

于 2012-08-20T23:01:16.540 回答
17

您可以像这样创建自定义 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());
于 2012-08-20T18:24:34.123 回答
4

使用System.Web.HttpUtility.HtmlEncode

HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))
于 2014-05-01T16:52:58.797 回答