私は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エンコードする方法はありますか?または、ビューでこれに対処する方法はありますか?
JSONをJavaScript文字列またはHTML属性値としてページにドロップする必要がある場合もありますが、JSONは有効なJavaScript構文であるため、ほとんどの場合、JavaScriptソースに直接含めるだけです。すべて。
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());
System.Web.HttpUtility.HtmlEncode を使用します
HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))