Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

564
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda