Serialiser des chaînes contenant des apostrophes avec JSON.Net

J'utilise JSON.Net comme mon sérialiseur pour une grande application Web MVC 3 dans c # et le moteur de visualisation Razor. Pour la charge de page initiale dans une vue, il existe une grande quantité de JSON déversés dans une balise de script à l'aide de @Html.Raw(JsonConvert.SerializeObject(myObject)) .

Le problème est que certaines valeurs de certains objets contiennent des apostrophes (pensez à des noms comme O'Brien), que JSON.Net n'échappe ni ne code en aucune façon.

Ce n'est pas une option pour coder préalablement les valeurs stockées dans la base de données car cela complique considérablement divers autres processus.

Existe-t-il un moyen de forcer JSON.Net à coder HTML sur les valeurs des objets qu'il sérialise, de la même manière que le JavaScriptSerializer intégré fonctionne lorsque vous appelez JavaScriptSerializer.Serialize(myObject) ? Ou, y at-il une façon de faire face à cela dans la vue?

Bien qu'il existe des cas dans lesquels vous pourriez vouloir déposer un JSON dans votre page en tant que chaîne JavaScript ou une valeur d'attribut HTML, le plus souvent, ce que vous feriez, c'est simplement l'intégrer directement à la source JavaScript, car JSON est une syntaxe JavaScript valide après tout.

 JsonSerializerSettings settings = = new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml }; JsonConvert.SerializeObject(obj, settings); 

Vous pouvez créer JsonConverter personnalisé comme ceci:

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

Pour l'utiliser uniquement pour la propriété Name, spécifiez-le par attribut:

 public class Person { [JsonConverter(typeof(EscapeQuoteConverter))] public string Name { get; set; } } 

Pour appliquer le convertisseur à toutes les chaînes, utilisez:

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

Utilisez System.Web.HttpUtility.HtmlEncode

 HttpUtility.HtmlEncode(JsonConvert.SerializeObject(myObject))