Wenn ich folgendes serialisiere:
[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; }
}
Ich bekomme dieses ekelhafte Durcheinander:
<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>
Was gibt? Wie kann ich das hübsch machen? JSON-Antworten enthalten auch das k_BackingField
Antworten:
Standardmäßig müssen Sie weder die Web-API verwenden
[Serializable]
noch[DataContract]
mit ihr arbeiten.Lassen Sie Ihr Modell einfach so, wie es ist, und die Web-API würde alle öffentlichen Eigenschaften für Sie serialisieren.
Nur wenn Sie mehr Kontrolle darüber haben möchten, was enthalten ist, dekorieren Sie Ihre Klasse mit
[DataContract]
und den Eigenschaften, die enthalten sein sollen[DataMember]
(da sowohl DCS als auch JSON.NET diese Attribute respektieren).Wenn Sie aus irgendeinem Grund das
[Serializable]
für Ihre Klasse benötigen (dh Sie serialisieren es aus irgendeinem Grund in einen Speicherstrom, erstellen tiefe Kopien usw.), müssen Sie beide Attribute zusammen verwenden, um die Namen der Hintergrundfelder zu verhindern:quelle
Es gibt eine allgemeinere Lösung: Sie können den Json Serializer
[Serializable]
so konfigurieren, dass das Attribut ignoriert wird, sodass Sie die Attribute in Ihren Klassen nicht ändern müssen.Sie sollten diese Konfigurationsänderung beim Start der Anwendung vornehmen, dh im
Application_Start
Ereignis Global.asax :Sie können auch andere Änderungen an der Json-Serialisierung vornehmen, z. B. die Angabe von Formaten für die Serialisierung von Datumsangaben und viele andere Dinge.
Dies gilt nur für die JSON-Serialisierung der Web-API. Die anderen Serialisierungen in der App (Web-API-XML-Serialisierung, MVC JsonResult ...) sind von dieser Einstellung nicht betroffen.
quelle
Update-Package Newtonsoft.Json
.Versuchen Sie, DataContract anstelle von Serializable zum Markieren Ihrer Klasse zu verwenden. Weitere Informationen zum Warum finden Sie in diesem guten Blogbeitrag zur Serialisierung automatischer Eigenschaften.
quelle
Die [DataContract] -Attribute haben bei mir nicht funktioniert, daher war dies keine Option.
XmlSerializer ignoriert [XmlAttribute] in WebApi
Die obige Lösung hat es für mich gelöst.
quelle