es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Deserializa luego serializa JSON con nombre de campo dinámico.

Tengo un archivo JSON que se ve algo así.

{
  "id": "top1",
  "components": [
    {
      "type": "resistor",
      "id": "res1",
      "resistance": {
        "default": 100,
        "min": 10,
        "max": 1000
      },
      "netlist": {
        "t1": "vdd",
        "t2": "n1"
      }
    },
    {
      "type": "nmos",
      "id": "m1",
      "m(l)": {
        "default": 1.5,
        "min": 1,
        "max": 2
      },
      "netlist": {
        "drain": "n1",
        "gate": "vin",
        "source": "vss"
      }
    }
  ]
}

Quiero crear una API usando OOP para trabajar con ese archivo JSON.
Hice las siguientes clases.

public class Topology
{
    [Required]
    public string id { get; set; }
    [Required]
    public List<topologycomponents> components { get; set; }
}
public class TopologyComponents
{
    [Required]
    public string type { get; set; }
    [Required]
    public string id { get; set; }
    [Required]
    public Values ???????? {get; set; }
    [Required]
    public Dictionary<string, string=""> netlist { get; set; }
}
public class Values
{
    [Required]
    public double @default { get; set; }
    [Required]
    public double min { get; set; }
    [Required]
    public double max { get; set; }
}

Mi pregunta es para esos signos de interrogación?????????
El nombre del campo es dinámico (resistance, m(l), …).
¿Cómo puedo manejar esos casos?
He intentado anotaciones de Jackson, expandobject y diccionarios, pero ninguno de ellos funcionó como quiero.</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una opción es utilizar un diccionario para manejar los nombres de campo dinámicos:

    public class TopologyComponents
    {
        [Required]
        public string type { get; set; }
        [Required]
        public string id { get; set; }
        [Required]
        public Dictionary<string, values=""> values { get; set; }
        [Required]
        public Dictionary<string, string=""> netlist { get; set; }
    }
    

    Con este enfoque, el nombre del campo dinámico (por ejemplo, “resistance”, “m(l)”, etc.) se convierte en la clave del diccionario, y el objeto Values correspondiente es el valor.

    Otra opción es utilizar la herencia y crear una clase separada para cada nombre de campo dinámico:

    public class TopologyComponents
    {
        [Required]
        public string type { get; set; }
        [Required]
        public string id { get; set; }
        [Required]
        public Resistance resistance {get; set; }
        [Required]
        public MValues m {get; set; }
        [Required]
        public Dictionary<string, string=""> netlist { get; set; }
    }
    
    public class Resistance
    {
        [Required]
        public Values values { get; set; }
    }
    
    public class MValues
    {
        [JsonProperty("m(l)")]
        [Required]
        public Values values { get; set; }
    }
    

    En este caso, creamos una clase separada para cada nombre de campo dinámico y usamos el atributo JsonProperty para especificar el nombre de campo correcto para el campo “m(l)”. La desventaja de este enfoque es que debemos agregar una clase separada cada vez que se agrega un nuevo nombre de campo dinámico al JSON.</string,></string,></string,>

Comments are closed.