J'utilise actuellement les mêmes DTO C # pour extraire des données de CouchDB, via LoveSeat que je vais retourner JSON via un contrôleur ASP MVC).
J'utilise la bibliothèque NewtonSoft pour séraliser mes DTO avant de les envoyer via le contrôleur.
Cependant, comme CouchDB utilise également NewtonSoft, il respecte également les attributs NewtonSoft au niveau de la propriété tels que
[JsonIgnore]
[JsonProperty("foo")]
Est-il possible de dire à la bibliothèque newtonsoft d'ignorer explicitement ces attributs? LoveSeat me permet de fournir ma propre implémentation de IObjectSerializer, ce qui me donne un contrôle total sur les netwonsofts JsonSerializerSettings. Alors, puis-je ignorer les attributs en utilisant ces paramètres?
Je demande comme la seule alternative que je peux voir à ce stade, est de duper mes DTO. Bien que ce ne soit pas terrible, ce n'est pas génial non plus.
La seule autre façon que je peux voir est d'apporter ma propre version de la source Newtonsoft.Json dans mon projet, avec un nom d'assembly différent, etc. route.
J'ai fini par créer toutes les propriétés dont j'avais besoin pour n'ajouter que des attributs à virtual, et les remplacer seuls dans une autre classe, avec les attributs newtonsoft pertinents.
Cela me permet d'avoir un comportement de sérialisation différent lors de la désérialisation de CouchDB et de la sérialisation pour un GET, sans trop de dupe. C'est bien, et un bonus, que les deux soient couplés; tout changement dans la base que je voudrais de toute façon.
Ce serait quand même bien de savoir si ma question d'origine est possible?
Je ne sais pas si c'est ce que vous recherchez, mais d'après ce que je comprends, vous recherchez le [JsonIgnore]
attribut. Empêche les propriétés d'être sérialisées avec le reste de l'objet dans JSON.
[JsonIgnore]
public string Whatever{ get; set; }
Une suggestion que vous pourriez ne pas aimer. Pour les meilleures pratiques, je recommande d'avoir deux objets presque identiques. Un spécifiquement pour votre couche d'accès aux données (objet de domaine) qui correspond à votre base de données. Et un DTO distinct dont vos applications se soucient. De cette façon, l'objet de domaine contiendra principalement plus de propriétés que le DTO et vous pouvez séparer les problèmes.
Utilise une propriété conditionnelle pour exclure une propriété de la sérialisation.
public class Employee
{
public string Name { get; set; }
public Employee Manager { get; set; }
public bool ShouldSerializeManager()
{
// don't serialize the Manager property if an employee is their own manager
return (Manager != this);
}
}
https://www.newtonsoft.com/json/help/html/SerializeConditionalProperty.htm
Ce lien newtonking.com a aidé dans une situation similaire. Il étend la classe DefaultContractResolver
. Pour que ça marche, je devais remplacer
protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)
avec
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)