Je souhaite définir un sérialiseur de contrat uniquement pour certains types dans mon application API Web ASP.NET. Je peux définir les parameters globalement dans App_Start / FormatterConfig.cs comme ceci:
public static void RegisterGlobalFormatters(MediaTypeFormatterCollection formatters) { jsonSerializerSettings.ContractResolver = new CriteriaContractResolver(new List(new ssortingng[]{"mdData", "name", "label"}));
…
mais comment puis-je simplement l’appliquer à un ou plusieurs types de classes spécifiques?
La raison pour laquelle je souhaite procéder est parce que je dois pouvoir définir les champs à sérialiser au moment de l’exécution en fonction de la configuration ou des parameters du service Web, similaires à ces exemples:
Avec JSON.net, comment puis-je empêcher la sérialisation des propriétés d’une classe dérivée, lorsqu’il est utilisé dans un contexte de classe de base?
http://json.codeplex.com/discussions/347610
Vous avez quelques options:
J’ai fini par utiliser un JsonConverter qui écrit uniquement les parameters spécifiés dans la liste “propriétés”. C’est plus bas niveau qu’un ContractResolver ou un formateur, mais je ne pense pas qu’il soit possible de configurer l’un ou l’autre pour un type spécifique.
public class ResourceConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(Resource)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { List properties = new List (new ssortingng[] { "Name", "Label" }); writer.WriteStartObject(); foreach (MemberInfo mi in value.GetType().GetMembers(BindingFlags.GetField | BindingFlags.Instance | BindingFlags.Public) ) { PropertyInfo p = mi as PropertyInfo; if (p != null && p.GetCustomAtsortingbutes(typeof(JsonIgnoreAtsortingbute), true).Length == 0 && properties.Contains(p.Name)) { writer.WritePropertyName(p.Name); serializer.Serialize(writer, p.GetValue(value, new object[] { })); } } writer.WriteEndObject(); } }
Ceci peut être appliqué à une classe en utilisant l’atsortingbut:
[JsonConverter(typeof(ResourceConverter))]
Cela ressemble à un bidouillage cependant, je pense que je devrais utiliser le résolveur de contrat pour obtenir la liste des propriétés à sérialiser au lieu d’utiliser directement la reflection, mais je ne sais pas comment.
J’essaierais de créer quelque chose comme ça
public class MyJsonFormatter : JsonMediaTypeFormatter { public override bool CanWriteType(Type type) { return type == typeof(MyClass); } }
puis insérez-le au début de la collection de formateurs