2017-05-22 3 views
3

Existe-t-il un moyen de configurer Json.Net pour coder automatiquement toutes les chaînes telles que HtmlEncode(myString) lorsque le modèle est sérialisé?Chaînes automatiquement HtmlEncode lorsque le modèle est sérialisé avec Json.Net

+0

Je ne me attendais pas si - je vous attendez à encoder des chaînes * en JSON *. Ce serait très bizarre pour lui de * coder en HTML * le contenu. Le travail d'un sérialiseur JSON est d'obtenir des données de X à Y en JSON ... pour que l'encodage HTML se fasse sentir comme un fluage massif. –

+0

Pourquoi ne pas créer une méthode dans laquelle vous passez l'objet à sérialiser et renvoie un résultat de chaîne codé html? – user1628733

+0

Est-ce ce que vous avez demandé? [encoding] (https://stackoverflow.com/questions/14106894/how-to-use-json-net-stringescapehandling-escapenonascii) – Artyom

Répondre

2

Vous pouvez utiliser une solution similaire à celle Selectively escape HTML in strings during deserialization, avec quelques changements mineurs:

  1. Modifier le HtmlEncodingValueProvider d'appliquer le codage GetValue plutôt que SetValue (de sorte qu'il fait le codage sur sérialisation plutôt que la désérialisation).
  2. Modifiez le résolveur pour appliquer le fournisseur de valeur à toutes les propriétés de chaîne plutôt que de rechercher un attribut.

Voici ce que le code résultant ressemblerait à ceci:

public class CustomResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> props = base.CreateProperties(type, memberSerialization); 

     // Attach an HtmlEncodingValueProvider instance to all string properties 
     foreach (JsonProperty prop in props.Where(p => p.PropertyType == typeof(string))) 
     { 
      PropertyInfo pi = type.GetProperty(prop.UnderlyingName); 
      if (pi != null) 
      { 
       prop.ValueProvider = new HtmlEncodingValueProvider(pi); 
      } 
     } 

     return props; 
    } 

    protected class HtmlEncodingValueProvider : IValueProvider 
    { 
     PropertyInfo targetProperty; 

     public HtmlEncodingValueProvider(PropertyInfo targetProperty) 
     { 
      this.targetProperty = targetProperty; 
     } 

     // SetValue gets called by Json.Net during deserialization. 
     // The value parameter has the original value read from the JSON; 
     // target is the object on which to set the value. 
     public void SetValue(object target, object value) 
     { 
      targetProperty.SetValue(target, (string)value); 
     } 

     // GetValue is called by Json.Net during serialization. 
     // The target parameter has the object from which to read the string; 
     // the return value is the string that gets written to the JSON 
     public object GetValue(object target) 
     { 
      string value = (string)targetProperty.GetValue(target); 
      return System.Web.HttpUtility.HtmlEncode(value); 
     } 
    } 
} 

Utilisez comme la coutume ContractResolver ceci:

var settings = new JsonSerializerSettings 
{ 
    ContractResolver = new CustomResolver(), 
    Formatting = Formatting.Indented 
}; 

string json = JsonConvert.SerializeObject(your_object, settings); 

Fiddle: https://dotnetfiddle.net/RhFlk8

0

Essayez ceci:

var json = JObject.Parse("{'Name':'<script>alert(1);</script>'}"); 
var serializerSettings = new JsonSerializerSettings() 
{ 
    StringEscapeHandling = StringEscapeHandling.EscapeHtml 
}; 
var result = JsonConvert.SerializeObject(json, serializerSettings); 

résultat sera:

{"Name":"\u003cscript\u003ealert(1);\u003c/script\u003e"}