序列化包含撇号的字符串与JSON.Net(Serializing strings containin

2019-06-27 05:12发布

我使用JSON.Net作为我的串行器在C#中大MVC 3 Web应用程序和Razor视图引擎。 例如,在一个视图中的初始页面加载,有使用脚本标签中倾倒大量的JSON @Html.Raw(JsonConvert.SerializeObject(myObject))

问题是,一些对象的一些值包含撇(思的名字,像奥布莱恩),这是JSON.Net不以任何方式逃避或编码。

这不是预先编码存储在数据库中,因为这大大各种其他处理,复杂的值的选项。

有没有办法迫使JSON.Net到HTML编码它系列化,该对象的值相同的方式,内置JavaScriptSerializer确实,当你调用JavaScriptSerializer.Serialize(myObject) ? 或者说,是有办法解决这个问题的看法?

Answer 1:

虽然也有一些情况,其中,您可能希望将一些JSON拖放到页面的JavaScript字符串或HTML属性值,通常你会怎么做简直是包括其直接插入JavaScript源,因为JSON是有效的JavaScript语法后所有。



Answer 2:

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

JsonConvert.SerializeObject(obj, settings);


Answer 3:

您可以创建这样的自定义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());


Answer 4:

使用System.Web.HttpUtility.HtmlEncode

HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))


文章来源: Serializing strings containing apostrophes with JSON.Net