反序列化然后使用动态字段名称序列化 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
的键是任意的。尽管 type
和 id
在所有组件中都是相同的,但 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);
}
我有一个看起来像这样的 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
的键是任意的。尽管 type
和 id
在所有组件中都是相同的,但 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);
}