簡體   English   中英

使用JSON.Net序列化包含撇號的字符串

[英]Serializing strings containing apostrophes with JSON.Net

我正在使用JSON.Net作為我在c#和Razor視圖引擎中的大型MVC 3 Web應用程序的序列化程序。 對於一個視圖中的初始頁面加載,使用@Html.Raw(JsonConvert.SerializeObject(myObject))在腳本標記內轉儲了大量JSON。

問題是某些對象的某些值包含撇號(想想像O'Brien這樣的名字),JSON.Net沒有以任何方式轉義或編碼。

對預存儲在數據庫中的值進行預編碼不是一種選擇,因為這會使各種其他進程復雜化。

有沒有辦法強制JSON.Net對HTML序列化對象的值進行編碼,就像調用JavaScriptSerializer.Serialize(myObject)時內置的JavaScriptSerializer一樣? 或者,有沒有辦法在視圖中處理這個問題?

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; } 
}

要將Converter應用於所有字符串,請使用:

JsonConvert.SerializeObject(person, Formatting.Indented, new EscapeQuoteConverter());

雖然在某些情況下您可能希望將某些JSON作為JavaScript字符串或HTML屬性值放入頁面中,但大多數情況下您只需將其直接包含在JavaScript源代碼中,因為JSON之后是有效的JavaScript語法所有。

使用System.Web.HttpUtility.HtmlEncode

HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM