Lorsque je sérialise les éléments suivants:
[Serializable]
public class Error
{
public string Status { get; set; }
public string Message { get; set; }
public string ErrorReferenceCode { get; set; }
public List<FriendlyError> Errors { get; set; }
}
Je reçois ce désordre dégoûtant:
<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>
Ce qui donne? Comment puis-je rendre ça joli? Les réponses JSON contiennent également le k_BackingField
Réponses:
Par défaut, vous n'avez pas besoin d'utiliser
[Serializable]
ni[DataContract]
de travailler avec l'API Web.Laissez simplement votre modèle tel quel, et l'API Web sérialiserait toutes les propriétés publiques pour vous.
Seulement si vous souhaitez avoir plus de contrôle sur ce qui est inclus, vous décorez ensuite votre classe avec
[DataContract]
et les propriétés à inclure[DataMember]
(car DCS et JSON.NET respectent ces attributs).Si pour une raison quelconque, vous avez besoin du
[Serializable]
sur votre classe (c'est-à-dire que vous la sérialisez dans un flux mémoire pour une raison quelconque, faites des copies approfondies, etc.), vous devez utiliser les deux attributs conjointement pour éviter les noms de champ de sauvegarde:la source
Il existe une solution plus générale: vous pouvez configurer le sérialiseur Json pour ignorer l'
[Serializable]
attribut, afin de ne pas avoir à modifier les attributs de vos classes.Vous devez effectuer ce changement de configuration au démarrage de l'application, c'est-à-dire dans l'
Application_Start
événement Global.asax :Vous pouvez également apporter d'autres modifications à la sérialisation Json, comme la spécification de formats pour la sérialisation des dates, et bien d'autres choses.
Cela ne s'appliquera qu'à la sérialisation JSON de l'API Web. Les autres sérialisations de l'application (sérialisation XML de l'API Web, MVC JsonResult ...) ne seront pas affectées par ce paramètre.
la source
Update-Package Newtonsoft.Json
.Essayez d'utiliser DataContract au lieu de Serializable pour marquer votre classe. Pour plus de détails sur les raisons, consultez ce bon article de blog sur la sérialisation des propriétés automatiques.
la source
Les attributs [DataContract] ne fonctionnaient pas pour moi, donc ce n'était pas une option.
XmlSerializer ignore [XmlAttribute] dans WebApi
La résolution ci-dessus l'a résolu pour moi.
la source