Pergunta

Eu estou tentando melhorar o padrão RestSharp de serialização usando Json.net a biblioteca.A fim de personalizar a serialização você tem que implementar ISerializer interface:

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

Como você vê eu sou também, estendendo a ContractResolver.Este é o código que faz a lowercasing:

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

Depois de tudo isso é a configuração que eu possa usá-lo com RestSharp:

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

Tudo funciona, exceto as propriedades não são em minúsculas.Quando a depuração de debuger vai para o Construtor da serializadores, mas é o método é chamado nunca.Quando eu tentei exatamente o mesmo para deserializations (IDeserialize interface, que atribui ao cliente), o método da carcaça inferior foi chamado para cada propriedade.

O que eu também tentei:

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

A coisa que eu notei com os dois últimos:se eu tiver minúsculas propriedades e deixe RestSharp serializa, em seguida, o pedido tem 5 parâmetros (um para cada propriedade).Se eu adicioná-lo através superior a dois métodos de apenas uma propriedade e que é todo o json.

Eu verifique o RestSharp problemas sem sucesso.Alguma sugestão?

Atualização:

Isso muito estranho:

  • bifurcou-se o RestSharp, instalado Json.net, funciona bem
  • copiado RestRequest classe de RestSharp garfo, colado ao meu pedido, usado, funciona bem
  • começou um novo projeto, instalado RestSharp e Json.net através do gerenciador de Pacotes, funciona bem

Em seguida, removidos todos os pacotes da minha aplicação principal, baixado novamente, não funciona.Meio que dando em cima desta.

Atualização 2: Depuração através de parágrafos versão percebi isso:O RequestFormat tem que ser Dataformat.Json ou ele vai usar Xml serializador.Mas isso não corrigir o problema.Eu tentei definição (existem apenas dois) serializadores para um valor nulo:

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

No novo projeto, eu fiz isso faz com que NullReferrenceException como o esperado.Mas o velho não acontece nada.Eu tentei renomear as variáveis, fazendo outra variável do mesmo tipo, mas nada resolve é.Ele só parece que no projeto que eu tenho a RestRequest classe é, de alguma forma incomodado.

Eu também adicionei um novo projeto para a solução.E até lá o código de obras.Portanto, é apenas um projeto que tem o problema.

Foi útil?

Solução

Desde que você não pode reproduzi-lo em um novo projeto, deve haver algo de diferente acontecendo neste projeto em particular, que está causando problemas, você está descrevendo.

Um par de coisas que você pode tentar (em nenhuma ordem particular):

  • Verifique se você está usando a mesma versão da biblioteca em ambos os projetos (o que funciona e o que não):pacote a versão e a plataforma de destino (net4, net35...).

  • Excluir o packages pasta de sua não-trabalho de projeto, para que o NuGet será forçado a re-download de todos os pacotes.

  • Pesquisa o caminho exato para a biblioteca referenciada no Visual Studio janela de Propriedades quando você tem RestSharp a partir de Referências do nó selecionado.Fazer uma comparação binária entre as bibliotecas referenciadas pelo trabalho e não-trabalho de projeto.

  • Infelizmente não há nenhum pacote de símbolo para RestSharp no SymbolSource, você não pode diretamente de depuração RestSharp em sua não-trabalho de projeto.Você poderia usar Reflector.NET VSPro se você tiver a licença ou não tiver utilizado o teste antes.

  • Mover as peças de sua não-trabalho de projeto para o trabalho até que ele pára de funcionar.

EDITAR:

Olhando para o código-fonte de RestRequest, AddObject parecem não usar o JsonSerializer você está definindo.Você já tentou usar AddBody em vez disso?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top