Ivan Franco

JsonSerialization y Key Dictionaries —Sobreescritura de la configuración

Problema inicial

El backend estaba retornando un diccionario donde las keys eran camelCase. Mientras que frontend estaba esperando que sean UPPERCASE para mantener uniformidad con data existente.

Investigación

Efectivamente, la configuración global de cómo serializar objetos a JSON indicaba que todas las propiedades tenían que ser camelCase.

Existen algunos atributos que con los que se puede marcar una propiedad para que al momento de serializarla tome dicha configuración.

[JsonProperty(NamingStrategyType=typeof(SnakeCaseNamingStrategy), NamingStrategyParameters = new object [] { false, false } )]
public object PropertyToBeSerialize { get; set; }

Donde el primer parámetro corresponde al seteo de la propiedad OverrideSpecifiedNames y el segundo a ProcessDictionaryKeys. Desafortunadamente, este atributo sólo aplica a la property misma y no a las property names de sus ítems.

Solución

Para poder aplicar un naming strategy a los ítems es necesario crear una subclase que herede de Dictionary<TKey, TValue> y aplicar el atributo a la nueva clase creada.

[JsonDictionary(NamingStrategyType = typeof(DefaultNamingStrategy))]
public class OurCustomSerializationDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
}

En este repositorio de Github podrán encontrar un ejemplo de la situación descripta.