[C#] 上位机开发个人笔记 Json解析为Dictionary
Json分析器
在WebApi接口对接时,简单的接口可能不想写Model类,而又需要拿到Json结果中的值。或者接口返回具有多种模式,例如正常返回和异常返回不同。这些场景,都可以利用Json分析器JsonParser,把Json字符串解析为IDictionary<String,Object> 和 IList<Object> 构成的字典树。理论上,任意Json数据都可以用 IDictionary<String,Object> 和 IList<Object> 嵌套来表示。
源数据json格式。(主要是4个电能表数据)
Topic[ModbusTcp01] {
"__startTime": "2022-03-17 18:05:20",
"__name": "ModbusTcp01",
"__description": "编号0001",
"__config": "[ModbusTcp] [ModbusTcp01] [127.0.0.1:502]",
"__success": 2322496,
"__failed": 0,
"__activeTime": "2022-03-24 11:24:49",
"__captureSpendTime": 88,
"__deviceStatus": true,
"__requestEnable": true,
"__onlineTime": "2022-03-17 18:05:22",
"__failedMsg": "",
"__alarmCount": {
"AlarmCount": 12,
"Hint": 0,
"Warn": 0,
"Error": 12,
"Fatal": 0
},
"Ua": 2215,
"Ub": 2164,
"Uc": 2220,
"Ia": 1203,
"Ib": 1466,
"Ic": 574,
"In": 2217,
"P": 2031,
"Pa": 1091,
"Pb": 1491,
"Pc": 1361,
"Q": 2207,
"Qa": 1726,
"Qb": 2220,
"Qc": 2071,
"S": 1947,
"Sa": 983,
"Sb": 506,
"Sc": 1033,
"PSum": 1353,
"PFa": 2186,
"PFb": 1473,
"PFc": 1723,
"Uab": 3782,
"Ubc": 3714,
"Uca": 3704,
"Fa": 5031,
"Fb": 4966,
"Fc": 4907,
"EpP": 696091,
"EqP": 314,
"EpN": 0,
"EqN": 0,
"a2": {
"Ua": 2215,
"Ub": 2164,
"Uc": 2220,
"Ia": 1203,
"Ib": 1466,
"Ic": 574,
"In": 2217,
"P": 2031,
"Pa": 1091,
"Pb": 1491,
"Pc": 1361,
"Q": 2207,
"Qa": 1726,
"Qb": 2220,
"Qc": 2071,
"S": 1947,
"Sa": 983,
"Sb": 506,
"Sc": 1033,
"PSum": 1353,
"PFa": 2186,
"PFb": 1473,
"PFc": 1723,
"Uab": 3782,
"Ubc": 3714,
"Uca": 3704,
"Fa": 5031,
"Fb": 4966,
"Fc": 4907,
"EpP": 696091,
"EqP": 314,
"EpN": 0,
"EqN": 0
},
"a3": {
"Ua": 2215,
"Ub": 2164,
"Uc": 2220,
"Ia": 1203,
"Ib": 1466,
"Ic": 574,
"In": 2217,
"P": 2031,
"Pa": 1091,
"Pb": 1491,
"Pc": 1361,
"Q": 2207,
"Qa": 1726,
"Qb": 2220,
"Qc": 2071,
"S": 1947,
"Sa": 983,
"Sb": 506,
"Sc": 1033,
"PSum": 1353,
"PFa": 2186,
"PFb": 1473,
"PFc": 1723,
"Uab": 3782,
"Ubc": 3714,
"Uca": 3704,
"Fa": 5031,
"Fb": 4966,
"Fc": 4907,
"EpP": 696091,
"EqP": 314,
"EpN": 0,
"EqN": 0
},
"a4": {
"Ua": 2215,
"Ub": 2164,
"Uc": 2220,
"Ia": 1203,
"Ib": 1466,
"Ic": 574,
"In": 2217,
"P": 2031,
"Pa": 1091,
"Pb": 1491,
"Pc": 1361,
"Q": 2207,
"Qa": 1726,
"Qb": 2220,
"Qc": 2071,
"S": 1947,
"Sa": 983,
"Sb": 506,
"Sc": 1033,
"PSum": 1353,
"PFa": 2186,
"PFb": 1473,
"PFc": 1723,
"Uab": 3782,
"Ubc": 3714,
"Uca": 3704,
"Fa": 5031,
"Fb": 4966,
"Fc": 4907,
"EpP": 696091,
"EqP": 314,
"EpN": 0,
"EqN": 0
}
}
转化为字典样式:
有2层嵌套的
解析过程
主要实现代码如下,便于自己复习。
代码说明,通过MQTT取得JSON数据,解析为字典数据便于页面显示。
var mqttPayload = JsonParser.Decode(e.Payload.ToStr());
foreach (var dic in mqttPayload)
if (dic.Value.ToDictionary().Count() > 1)//通过count判断Json的嵌套深度
{
var configs = dic.Value.ToDictionary();
foreach (var pair in configs)
keyValuePairs.AddOrUpdate(e.Topic + "/" + dic.Key + "." + pair.Key,
pair.Value.ToString(),
(k, v) => keyValuePairs[e.Topic + "/" + dic.Key + "." + pair.Key] =
pair.Value.ToString());
}
else
{
keyValuePairs.AddOrUpdate(e.Topic + "/" + dic.Key, dic.Value.ToString(),
(k, v) => keyValuePairs[e.Topic + "/" + dic.Key] = dic.Value.ToString());