serialize newtonsoft net jobject deserialize serialization json.net signalr deserialization

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