Comment définir Json.NET ContractSerializer pour un type spécifique plutôt que globalement?

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:

  • Créez un type personnalisé géré par un formateur personnalisé. Ce type personnalisé pourrait spécifier (d’une manière ou d’une autre) quels champs doivent être sérialisés (et cette information ensuite introduite dans un sérialiseur Json)
  • Examinez la configuration de chaque contrôleur (voir ici ) pour essayer de configurer le formateur comme requirejs.

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