¿Cómo ignorar JsonProperty (PropertyName = “someName”) al serializar json?

Tengo un código C # usando ASP.Net MVC, que está utilizando Json.Net para serializar algunos DTO. Para reducir la carga útil, he utilizado el atributo [JsonProperty (PropertyName = “shortName”)] para utilizar nombres de propiedades más cortos durante la serialización.

Esto funciona muy bien cuando el cliente es otra aplicación o servicio .Net, ya que la deserialización vuelve a unir la jerarquía de objetos, utilizando los nombres más largos y amigables, a la vez que mantiene baja la carga de transferencia real.

El problema entra en juego cuando el cliente es javascript / ajax a través de un navegador. Realiza la solicitud, y obtiene el json … pero ese json usa los nombres menos amigables acortados.

¿Cómo puedo hacer que el motor de serialización de json.net ignore el atributo [JsonProperty (PropertyName = “shortName”)] de forma programática? Idealmente, mi servicio MVC se instalará allí y normalmente se serializará utilizando los nombres de propiedades abreviados. Cuando mi código detecta un parámetro en particular, me gustaría obtener la serialización de los datos usando los nombres más largos e ignorar el atributo [JsonProperty ()].

¿Alguna sugerencia?

Gracias,

Kevin

Esto se puede hacer con bastante facilidad usando una resolución de contrato personalizada. Aquí está todo el código que necesitaría:

 class LongNameContractResolver : DefaultContractResolver { protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { // Let the base class create all the JsonProperties // using the short names IList list = base.CreateProperties(type, memberSerialization); // Now inspect each property and replace the // short name with the real property name foreach (JsonProperty prop in list) { prop.PropertyName = prop.UnderlyingName; } return list; } } 

Aquí hay una demostración rápida usando el resolvedor:

 class Program { static void Main(string[] args) { Foo foo = new Foo { CustomerName = "Bubba Gump Shrimp Company", CustomerNumber = "BG60938" }; Console.WriteLine("--- Using JsonProperty names ---"); Console.WriteLine(Serialize(foo, false)); Console.WriteLine(); Console.WriteLine("--- Ignoring JsonProperty names ---"); Console.WriteLine(Serialize(foo, true)); } static string Serialize(object obj, bool useLongNames) { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Formatting = Formatting.Indented; if (useLongNames) { settings.ContractResolver = new LongNameContractResolver(); } return JsonConvert.SerializeObject(obj, settings); } } class Foo { [JsonProperty("cust-num")] public string CustomerNumber { get; set; } [JsonProperty("cust-name")] public string CustomerName { get; set; } } 

Salida:

 --- Using JsonProperty names --- { "cust-num": "BG60938", "cust-name": "Bubba Gump Shrimp Company" } --- Ignoring JsonProperty names --- { "CustomerNumber": "BG60938", "CustomerName": "Bubba Gump Shrimp Company" }