21

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

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

データベースに保存されている値を事前にエンコードすることは、他のさまざまなプロセスを非常に複雑にするため、オプションではありません。

JSON.Net にシリアライズするオブジェクトの値を強制的に HTML エンコードさせる方法はありますJavaScriptSerializer.Serialize(myObject)か? または、ビューでこれに対処する方法はありますか?

4

4 に答える 4

18

一部の JSON を JavaScript 文字列または HTML 属性値としてページにドロップしたい場合もありますが、ほとんどの場合、JSON は有効な JavaScript 構文であるため、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 に答える