Question

J'essaie d'améliorer la sérialisation RestSharp par défaut en utilisant la bibliothèque Json.net.Afin de personnaliser la sérialisation, vous devez implémenter l'interface ISerializer :

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; }
}

Comme vous le voyez, j'étends également ContractResolver.Voici le code qui effectue la mise en minuscule :

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

Une fois tout cela configuré, je peux l'utiliser avec RestSharp :

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

Tout fonctionne, sauf que les propriétés ne sont pas en minuscules.Lors du débogage, le débogueur entre dans le constructeur des sérialiseurs, mais sa méthode n'est jamais appelée.Lorsque j'ai essayé exactement la même chose pour les désérialisations (interface IDeserialize, qui s'attache au client), la méthode de casse a été appelée pour chaque propriété.

Ce que j'ai également essayé :

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);

Ce que j'ai remarqué avec les deux derniers :si j'ai des propriétés en minuscules et que je laisse RestSharp sérialiser, la requête comporte 5 paramètres (un pour chaque propriété).Si je l'ajoute via les deux méthodes supérieures, il n'a qu'une seule propriété et c'est l'intégralité du json.

Je vérifie les problèmes RestSharp en vain.Aucune suggestion?

Mise à jour:

C'est très étrange :

  • a créé le RestSharp, installé Json.net, fonctionne bien
  • classe RestRequest copiée à partir du fork RestSharp, collée dans mon application, utilisée, fonctionne bien
  • commencé un nouveau projet, installé RestSharp et Json.net via le gestionnaire de packages, fonctionne bien

Ensuite, tous les packages supprimés de mon application principale, retéléchargés, ne fonctionnent pas.J'abandonne un peu ça.

Mise à jour 2 :En débogant via la version forkée, j'ai remarqué ceci :Le RequestFormat doit être Dataformat.Json ou il utilisera le sérialiseur XML.Mais cela ne résout pas le problème.J'ai essayé de définir les deux sérialiseurs (il n'y en a que deux) sur null :

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

Dans le nouveau projet que j'ai fait, cela provoque NullReferrenceException comme prévu.Mais dans l'ancien, rien ne se passe.J'ai essayé de renommer les variables, en créant une autre variable du même type, mais rien n'est résolu.Il semble simplement que dans le projet que j'ai, la classe RestRequest est en quelque sorte buggée.

J'ai également ajouté un nouveau projet à la solution.Et même là, le code fonctionne.C'est donc juste un projet qui pose problème.

Était-ce utile?

La solution

Puisque vous ne pouvez pas le reproduire dans un nouveau projet, il doit y avoir quelque chose de différent dans ce projet particulier, qui est à l'origine des problèmes que vous décrivez.

Quelques choses que vous pouvez essayer (sans ordre particulier) :

  • Vérifiez que vous utilisez exactement la même version de la bibliothèque dans les deux projets (celui qui fonctionne et celui qui ne fonctionne pas) :version du package et plateforme cible (net4, net35...).

  • Supprimer le packages dossier de votre projet qui ne fonctionne pas afin que NuGet soit obligé de retélécharger tous les packages.

  • Recherchez le chemin exact de la bibliothèque référencée dans la fenêtre Propriétés de Visual Studio lorsque vous avez sélectionné le nœud RestSharp à partir des références.Effectuez une comparaison binaire entre les bibliothèques référencées par le projet en cours et le projet qui ne fonctionne pas.

  • Malheureusement, il n'y a pas de package de symboles pour RestSharp sur Source du symbole, vous ne pouvez donc pas déboguer directement RestSharp dans votre projet qui ne fonctionne pas.Vous pourriez utiliser Reflector.NET VSPro si vous avez la licence ou si vous n'avez jamais utilisé la version d'essai auparavant.

  • Déplacez les parties de votre projet qui ne fonctionne pas vers celui qui fonctionne jusqu'à ce qu'il cesse de fonctionner.

MODIFIER:

En regardant le code source de RestRequest, AddObject ne semble pas utiliser le JsonSerializer vous définissez.Avez-vous essayé d'utiliser AddBody plutôt?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top