Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

553
Vistas
Deserializar en un diccionario que no distingue entre mayúsculas y minúsculas usando System.Text.Json

Estoy tratando de deserializar json en un objeto con una propiedad de tipo Dictionary<string,string> . Especifico el comprador para el Diccionario como StringComparer.OrdinalIgnoreCase . Aquí está esta clase:

 class DictionaryTest { public Dictionary<string, string> Fields { get; set; } public DictionaryTest() { Fields = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); } }

Pero cuando ocurre la deserialización, el comparador se cambia al genérico. Por lo tanto, no puedo acceder a las claves de mi diccionario sin distinguir entre mayúsculas y minúsculas.

 var points = new Dictionary<string, string> { { "James", "9001" }, { "Jo", "3474" }, { "Jess", "11926" } }; var testObj = new {Fields = points}; var dictionaryJsonText = JsonSerializer.Deserialize<DictionaryTest>(JsonSerializer.Serialize(testObj, options:new JsonSerializerOptions() { IgnoreNullValues = true, WriteIndented = false, PropertyNamingPolicy = null, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, DictionaryKeyPolicy = JsonNamingPolicy.CamelCase, PropertyNameCaseInsensitive = true })); string nameJsonText = "", nameJsonText2=""; //Because of the naming policy specified above, the keys are camelCase. //So keys are james, jo and jess //I expect to be able to access either james, or James as keys. dictionaryJsonText?.Fields.TryGetValue("James", out nameJsonText); dictionaryJsonText?.Fields.TryGetValue("james", out nameJsonText2); Console.WriteLine($"Name with system.text.json is: {nameJsonText}"); Console.WriteLine($"Name with system.text.json is: {nameJsonText2}"); Console.WriteLine($"Comparer is {dictionaryJsonText?.Fields.Comparer}");

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Entonces, ¿cómo puedo deserializar json en una clase como la siguiente y mantener su insensibilidad a mayúsculas y minúsculas? ¿Alguna sugerencia? Estoy usando .net5. Y debo mencionar que este código funcionaría perfectamente bien usando Newtonsoft . El comparador permanecerá como OrdinalIgnoreCase y se mantendrá la distinción entre mayúsculas y minúsculas.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Actualmente no hay una manera de hacer lo que quieres. Pero puede implementar la funcionalidad usted mismo.

Podría crear un JsonConverter personalizado para este caso específico. Por ejemplo:

 public sealed class CaseInsensitiveDictionaryConverter<TValue> : JsonConverter<Dictionary<string, TValue>> { public override Dictionary<string, TValue> Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var dic = (Dictionary<string, TValue>)JsonSerializer .Deserialize(ref reader, typeToConvert, options); return new Dictionary<string, TValue>( dic, StringComparer.OrdinalIgnoreCase); } public override void Write( Utf8JsonWriter writer, Dictionary<string, TValue> value, JsonSerializerOptions options) { JsonSerializer.Serialize( writer, value, value.GetType(), options); } }

Luego puede vincularlo a la propiedad específica haciendo esto:

 class DictionaryTest { [JsonConverter(typeof(CaseInsensitiveDictionaryConverter<string>))] public Dictionary<string, string> Fields { get; set; } = new Dictionary<string, string>(); }

Y eso es. Simplemente puede deserializar como de costumbre:

 var json = JsonSerializer.Serialize(new DictionaryTest { Fields = { { "One", "Two" }, { "Three", "Four" } } }); var dictionaryJsonText = JsonSerializer.Deserialize<DictionaryTest>(json);

El ejemplo anterior producirá un diccionario con claves que no distinguen entre mayúsculas y minúsculas.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda