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

344
Visualizações
System.Text.Json no se deserializará a mi tipo aunque mi constructor implemente cada propiedad

No puedo entender por qué System.Text.Json no deserializará esta cadena JSON simple a mi tipo .NET especificado. Obtengo que Each parameter in the deserialization constructor on type 'MenuItem' must bind to an object property or field on deserialization. Each parameter name must match with a property or field on the object. The match can be case-insensitive , aunque he asignado todas las propiedades ( name , url y permissions ) en mi constructor MenuItem .

Demostración de violín de Dotnet

 using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; public class Program { public static void Main() { try { var json = @" [ { ""name"": ""General Info"", ""url"": ""/Info"", ""permissions"": [] }, { ""name"": ""Settings"", ""url"": ""/Settings"", ""permissions"": [ ""Admin"" ] } ]"; Console.WriteLine(json); var menu = new Menu(json); Console.WriteLine("Deserialization success"); } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } } } public class Menu { public Menu(string json) { var items = JsonSerializer.Deserialize<List<MenuItem>>(json); MenuItems = items.AsReadOnly(); } public IReadOnlyList<MenuItem> MenuItems { get; } } public class MenuItem { [JsonConstructor] public MenuItem ( string name, string url, List<Permission> permissions ) { this.Name = name; this.Url = url; this.Permissions = (permissions ?? new List<Permission>()).AsReadOnly(); } public string Name { get; } public string Url { get; } public IReadOnlyList<Permission> Permissions { get; } } public enum Permission { Admin, FinancialReporting }

¿Alguien puede decirme qué estoy haciendo mal?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

He echado un vistazo a tu violín y he detectado un par de problemas. Violín de trabajo aquí

  1. System.Text.Json entre mayúsculas y minúsculas de forma predeterminada ( excepto para aplicaciones web ). Puede resolver esto usando PropertyNamingPolicy = JsonNamingPolicy.CamelCase o PropertyNameCaseInsensitive = true en las opciones del serializador.

  2. El segundo problema se describe en Enums como cadenas

    De forma predeterminada, las enumeraciones se serializan como números. Para serializar nombres de enumeración como cadenas, use JsonStringEnumConverter.

    Debe agregar JsonSerializerOptions para resolver (1) y (2):

     var options = new JsonSerializerOptions { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) }, PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; var items = JsonSerializer.Deserialize<List<MenuItem>>(json, options);
  3. El tercer problema parece estar relacionado con el enlace en el constructor para la lista de Permissions . En el constructor, define una List<Permission> para el parámetro de permisos. Recibo el error en su pregunta a menos que el tipo de argumento del constructor coincida exactamente con el tipo de propiedad del modelo. Entonces, actualicé el constructor para tomar una IReadOnlyList<Permission> y se deserializa con éxito:

     [JsonConstructor] public MenuItem ( string name, string url, IReadOnlyList<Permission> permissions ) { this.Name = name; this.Url = url; this.Permissions = permissions ?? new List<Permission>().AsReadOnly(); }

    Como alternativa, puede cambiar la propiedad Permissions a List<Permission> .

Esta respuesta a una pregunta con un problema similar explica que esto es en realidad una limitación de System.Text.Json y actualmente hay un problema abierto de github .

Una bifurcación de trabajo de su violín se muestra aquí .

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