serialization - newtonsoft - SignalR: use camel case
newtonsoft json deserialize expandoobject (4)
Me gustaría saber si hay una forma de configurar SignalR para que el cliente funcione en los objetos de devolución del concentrador usando camel case.
Gracias.
Haga rodar su propio resolutor Conttract como
public class SignalRContractResolver : IContractResolver
{
private readonly Assembly assembly;
private readonly IContractResolver camelCaseContractResolver;
private readonly IContractResolver defaultContractSerializer;
public SignalRContractResolver()
{
defaultContractSerializer = new DefaultContractResolver();
camelCaseContractResolver = new CamelCasePropertyNamesContractResolver();
assembly = typeof(Connection).Assembly;
}
public JsonContract ResolveContract(Type type)
{
if (type.Assembly.Equals(assembly))
{
return defaultContractSerializer.ResolveContract(type);
}
return camelCaseContractResolver.ResolveContract(type);
}
}
Registrarlo como
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
GlobalHost.DependencyResolver.Register(typeof (JsonSerializer), () => serializer);
Si usa un IoC personalizado, puede tener problemas porque JsonSerializer
es un tipo concreto y algunos IoC como, por ejemplo, Ninject , inyectarán tipos de concreto independientes . En el caso de Ninjects, la solución es registrarlo con Ninject en lugar de con DependencyResolver
propio de SignalRs.
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
kernel.Bind<JsonSerializer>().ToConstant(serializer);
Más información en mi blog: http://andersmalmgren.com/2014/02/27/why-overriding-jsonserializer-no-longer-work-in-signalr-2-0/
La respuesta de Anders es correcta; Solo quería agregar que para cualquiera que use AutoFac en lugar de Ninject, debe usar este registro en su startup.cs
:
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();
Para usar con ASP .NET Core, puede registrar el JsonSerializer así en Inicio -> ConfigureServices:
var settings = new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() };
var serializer = JsonSerializer.Create(settings);
services.AddSingleton(serializer);
Si no quiere interferir con la configuración de SignalR o le parece que tiene demasiadas complicaciones, puede agregar el atributo JsonProperty para especificar el nombre de la propiedad después de la serialización en su modelo. JsonProperty es de JSON.NET, que SignalR usa para la serialización.
[JsonProperty("id")]
public byte Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }