Pregunta

Yo estoy tratando de mejorar el valor predeterminado RestSharp serialización mediante el uso de Json.net biblioteca.Con el fin de personalizar la serialización que tienen que implementar ISerializer interfaz:

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 se puede ver también estoy ampliando el ContractResolver.Este es el código que hace la minúscula:

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

Una vez que todo esto es el programa de instalación lo puedo usar con RestSharp:

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

Todo funciona, excepto las propiedades no están en minúsculas.Cuando la depuración de la debuger que pasa en el Constructor de la serializadores, pero el método no se llama nunca.Cuando traté de exactamente el mismo para deserializations (IDeserialize interfaz, la cual se conecta con el cliente) el método para la cubierta inferior se llama para cada propiedad.

Lo que también he probado:

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

La cosa que he notado con los dos últimos:si tengo minúsculas propiedades y vamos a RestSharp serializa la solicitud tiene 5 parámetros (uno para cada propiedad).Si puedo añadir es superior a través de dos métodos que sólo tiene una propiedad y que todo el json.

Puedo comprobar el RestSharp problemas fue en vano.Alguna sugerencia?

Actualización:

Esta muy extraño:

  • horquillado de la RestSharp, instalado Json.net, funciona bien
  • copiado RestRequest clase de RestSharp tenedor, pegado a mi solicitud, usado, funciona bien
  • iniciado un nuevo proyecto, instalado RestSharp y Json.net a través del gestor de Paquetes, funciona bien

A continuación, retira todos los paquetes de mi aplicación principal, redownloaded, no funciona.Un poco de renunciar a este.

Actualización 2: La depuración a través de la versión bifurcada me di cuenta de esto:El RequestFormat tiene que ser Dataformat.Json o se utilizará Xml serializador.Pero eso no soluciona el problema.He probado la configuración de ambos (sólo hay dos) serializadores a null:

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

En el nuevo proyecto que hice esto hace que NullReferrenceException como se esperaba.Pero en la otra no pasa nada.He intentado cambiar el nombre de las variables, haciendo otra variable del mismo tipo, pero nada de errores es.Parece que en el proyecto que el RestRequest clase es de alguna manera intervenidas.

También he añadido un nuevo proyecto a la solución.Y aun no funciona el código.Así que es sólo uno de los proyectos que tiene el problema.

¿Fue útil?

Solución

Ya que no se puede reproducir en un nuevo proyecto, debe haber algo diferente en este proyecto en particular, que causa los problemas, estás describiendo.

Un par de cosas que usted puede probar (en ningún orden en particular):

  • Compruebe que está utilizando exactamente la misma versión de la biblioteca en ambos proyectos (el que funciona y el que no):paquete de versión y plataforma de destino (net4, net35...).

  • Eliminar la packages carpeta de su proyecto de trabajo para que NuGet se ven obligados a volver a descargar todos los paquetes.

  • La búsqueda de la ruta exacta a la biblioteca de referencia en la ventana de Propiedades de Visual Studio cuando usted tiene RestSharp de Referencias nodo seleccionado.Hacer una comparación binaria entre las bibliotecas de referencia por el trabajo y el no-proyecto de trabajo.

  • Lamentablemente no hay ningún paquete de símbolo para RestSharp en SymbolSource, por lo que directamente no se puede depurar RestSharp en su no-trabajo del proyecto.Usted podría utilizar Reflector.NET VSPro si usted tiene la licencia o no ha utilizado la prueba antes.

  • Mover las piezas de su proyecto de trabajo para el trabajo de uno hasta que deja de trabajar.

EDITAR:

Buscando en la código fuente de RestRequest, AddObject no parece que el uso de la JsonSerializer se están estableciendo.Has probado a utilizar AddBody en su lugar?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top