web-dev-qa-db-ja.com

JSON.Netを使用したアポストロフィを含む文字列のシリアル化

私はJSON.Netをc#の大規模なMVC 3 WebアプリケーションとRazorビューエンジンのシリアライザーとして使用しています。 1つのビューでの最初のページの読み込みでは、@Html.Raw(JsonConvert.SerializeObject(myObject))を使用してスクリプトタグ内に大量のJSONがダンプされます。

問題は、一部のオブジェクトの一部の値にアポストロフィ(O'Brienのような名前と考えてください)が含まれていることです。これは、JSON.Netがエスケープしたりエンコードしたりしない方法です。

他のさまざまなプロセスが非常に複雑になるため、データベースに格納されている値を事前にエンコードすることはできません。

組み込みのJavaScriptSerializerがJavaScriptSerializer.Serialize(myObject)を呼び出すときに行うのと同じ方法で、JSON.Netがシリアル化するオブジェクトの値を強制的にHTMLエンコードする方法はありますか?または、ビューでこれに対処する方法はありますか?

20
dodexahedron

JSONをJavaScript文字列またはHTML属性値としてページにドロップする必要がある場合もありますが、JSONは有効なJavaScript構文であるため、ほとんどの場合、JavaScriptソースに直接含めるだけです。すべて。

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

JsonConvert.SerializeObject(obj, settings);
26
rrymar

次のようにカスタム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());
16
Pavel Bakshy

System.Web.HttpUtility.HtmlEncode を使用します

HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))
3
Preston S