Frage

Ich versuche, die standardmäßige RestSharp-Serialisierung mithilfe der Json.net-Bibliothek zu verbessern.Um die Serialisierung anzupassen, müssen Sie die ISerializer-Schnittstelle implementieren:

public class LowerCaseSerializer : ISerializer{
    public LowerCaseSerializer(){
        ContentType = "application/json";
    }

    public string Serialize(object obj){
         var settings = new JsonSerializerSettings{
            ContractResolver = new LowerCaseResolver()
        };
        return JsonConvert.SerializeObject(obj, Formatting.None, settings);
    }

    string ISerializer.RootElement { get; set; }
    string ISerializer.Namespace { get; set; }
    string ISerializer.DateFormat { get; set; }
    public string ContentType { get; set; }
}

Wie Sie sehen, erweitere ich auch den ContractResolver.Dies ist der eigentliche Code, der die Kleinschreibung übernimmt:

public class LowerCaseResolver : DefaultContractResolver{
    protected override string ResolvePropertyName(string propertyName){
        return propertyName.ToLower();
    }
}

Sobald dies alles eingerichtet ist, kann ich es mit RestSharp verwenden:

var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
    request.JsonSerializer = new LowerCaseSerializer();
    request.AddObject(body);
}
var response = client.Execute<T>(request);

Alles funktioniert, außer dass die Eigenschaften nicht in Kleinbuchstaben geschrieben sind.Beim Debuggen geht der Debuger in den Konstruktor der Serialisierer, seine Methode wird jedoch nie aufgerufen.Als ich genau das Gleiche für Deserialisierungen (IDeserialize-Schnittstelle, die an den Client angeschlossen wird) versucht habe, wurde für jede Eigenschaft die Methode für Kleinschreibung aufgerufen.

Was ich auch versucht habe:

request.RequestFormat = DataFormat.Json;  // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);

Was mir bei den letzten beiden aufgefallen ist:Wenn ich Eigenschaften in Kleinbuchstaben habe und RestSharp serialisieren lasse, hat die Anfrage 5 Parameter (einen für jede Eigenschaft).Wenn ich es über die beiden oberen Methoden hinzufüge, hat es nur eine Eigenschaft und das ist der gesamte JSON.

Ich überprüfe die RestSharp-Probleme ohne Erfolg.Irgendwelche Vorschläge?

Aktualisieren:

Das ist sehr seltsam:

  • RestSharp geforkt, Json.net installiert, funktioniert einwandfrei
  • Ich habe die RestRequest-Klasse vom RestSharp-Fork kopiert, in meine Anwendung eingefügt, verwendet und funktioniert einwandfrei
  • Neues Projekt gestartet, RestSharp und Json.net über den Paketmanager installiert, funktioniert einwandfrei

Dann alle Pakete aus meiner Hauptanwendung entfernt und erneut heruntergeladen, funktioniert nicht.Ich gebe das irgendwie auf.

Update 2:Beim Debuggen der gespaltenen Version ist mir Folgendes aufgefallen:Das RequestFormat muss Dataformat.Json sein, sonst wird der XML-Serializer verwendet.Aber das behebt das Problem nicht.Ich habe versucht, beide (es gibt nur zwei) Serialisierer auf Null zu setzen:

request.JsonSerializer = null;
request.XmlSerializer = null;

In dem neuen Projekt, das ich durchgeführt habe, verursacht dies wie erwartet eine NullReferenceException.Aber im alten passiert nichts.Ich habe versucht, die Variablen umzubenennen und eine andere Variable desselben Typs zu erstellen, aber das Problem wurde nicht behoben.Es scheint nur, dass in dem Projekt, das ich habe, die RestRequest-Klasse irgendwie fehlerhaft ist.

Ich habe der Lösung auch ein neues Projekt hinzugefügt.Und selbst dort funktioniert der Code.Es ist also nur ein Projekt, das das Problem hat.

War es hilfreich?

Lösung

Da Sie es in einem neuen Projekt nicht reproduzieren können, muss in diesem bestimmten Projekt etwas anderes vor sich gehen, das die von Ihnen beschriebenen Probleme verursacht.

Ein paar Dinge, die Sie ausprobieren könnten (in keiner bestimmten Reihenfolge):

  • Stellen Sie sicher, dass Sie in beiden Projekten genau dieselbe Version der Bibliothek verwenden (diejenige, die funktioniert, und die, die nicht funktioniert):Paketversion und Zielplattform (net4, net35...).

  • Löschen Sie die packages Ordner Ihres nicht funktionierenden Projekts, sodass NuGet gezwungen wird, alle Pakete erneut herunterzuladen.

  • Suchen Sie im Visual Studio-Eigenschaftenfenster nach dem genauen Pfad zur referenzierten Bibliothek, wenn Sie „RestSharp“ über den Knoten „Referenzen“ ausgewählt haben.Führen Sie einen binären Vergleich zwischen den Bibliotheken durch, auf die das funktionierende und das nicht funktionierende Projekt verweisen.

  • Leider gibt es kein Symbolpaket für RestSharp SymbolQuelle, sodass Sie RestSharp nicht direkt in Ihrem nicht funktionierenden Projekt debuggen können.Du könntest benutzen Reflector.NET VSPro wenn Sie über die Lizenz verfügen oder die Testversion noch nicht genutzt haben.

  • Verschieben Sie Teile Ihres nicht funktionierenden Projekts in das funktionierende Projekt, bis es nicht mehr funktioniert.

BEARBEITEN:

Mit Blick auf die Quellcode von RestRequest, AddObject scheint das nicht zu nutzen JsonSerializer Du stellst ein.Haben Sie es versucht? AddBody stattdessen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top