反序列化然后使用动态字段名称序列化 json

deserialize then serialize json with dynamic field name

我有一个看起来像这样的 JSON 文件。

{
  "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"
      }
    }
  ]
}

我想制作一个 API 使用 oop 来处理那个 JSON 文件, 我做了以下 类.

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; }
    }

我的问题是那些问号???????? 字段名称是动态的 resistance, m(l), .....
我该如何处理这些情况?
我尝试了 Jackson 注释、expandobject 和字典。但是 none 他们的工作如我所愿。

从外观上看,您的 Topology class 需要 Dictionary<string, dynamic> 数据类型,因为 components 的键是任意的。尽管 typeid 在所有组件中都是相同的,但 netlist 和另一个 属性 将是动态的。

将您的组件列表更改为 Dictionary<string, dynamic>,然后通过首先检查组件中实际存在的 属性 来获取您需要的数据。

public class Topology
{
    [Required]
    public string id { get; set; }
    [Required]
    public List<Dictionary<string, dynamic>> components { get; set; }
}

这将为您提供一个以字符串为键、以动态对象为值的字典列表。您可以在 components.Keys 上使用 foreach 循环遍历键,也许还可以使用 switch 语句来查看在遍历每个组件时是否存在您期望的键。

有关如何创建自己的组件列表的示例...不确定您将如何使用数据,因为这将驱动您反序列化此数据的方式,

var obj = JsonConvert.DeserializeObject<Topology>(jsonText);
List<dynamic> allComps = new List<dynamic>();
foreach(var component in obj.components)
{
    var comp = new ExpandoObject() as IDictionary<string, object>;
    foreach(var key in component.Keys)
    {
        switch (key)
        {
            case "id":
            case "type":
                comp.Add(key, component[key].ToString());
                break;

            case "netlist":
                comp.Add(key, component[key].ToObject<Dictionary<string, string>>());
                break;

            default:
                comp.Add(key, component[key].ToObject<Values>());
                break;
        }
    }
    allComps.Add(comp);
}