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



我有一个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"
}
}
]
}

我想使用oop制作一个API来处理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和字典。但没有一个像我想要的那样工作。

从外观上看,Topology类需要具有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);
}

最新更新