Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

554
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!