c# - 反序列化 JSON 字符串时遇到问题
问题描述
对于我目前正在进行的一个项目,我遇到了很多麻烦。我从外部来源得到一个 JSON 字符串。我收到的 JSON 字符串如下:
{
"PC_Station": [{
"PLC_0": {
"DB1": {
"test123": 0
},
"STOP": false,
"START": false,
"Start_1": false,
"Stop_1": false,
"Led1": true,
"Led2": false,
"Led3": true,
"Counter": 4002,
"Sliderval": 0
}
}, {
"PLC_1": {
"DB1": {
"test123": 0
},
"Led_1": false,
"Led_2": false,
"Led_3": false,
"Led_4": false,
"Tag1": true,
"Tag2": false,
"Tag3": true,
"Counter": 4002,
"randomNr": 0
}
}]
}
外部源的制作方式是 PLC 设备(工业 I/O)将其拥有的所有变量发送到服务器。服务器收集 PLC 设备的名称以及它包含的所有变量,并将所有 PLC 设备添加到一个数组中,就像上面的 JSON 一样。
我需要什么:我正在尝试在 C# 中创建一个 JSON Deserializer,它可以动态捕获所有变量和变量名。我将在我正在为分配做的应用程序中使用它。它是在 Unity3d 中使用 PLC 变量填充 GUI,但这与此上下文无关。
我尝试的最后一件事是:
static void Main(string[] args)
{
string json = "{\"PC_Station\": [{\"PLC_0\": {\"DB1\": {\"test123\": 0}, \"STOP\": false, \"START\": false, \"Start_1\": false, \"Stop_1\": false, \"Led1\": true, \"Led2\": false, \"Led3\": true, \"Counter\": 4002, \"Sliderval\": 0}},{\"PLC_1\": {\"DB1\": {\"test123\": 0}, \"STOP\": false, \"START\": false, \"Start_1\": false, \"Stop_1\": false, \"Led1\": true, \"Led2\": false, \"Led3\": true, \"Counter\": 4002, \"Sliderval\": 0}}]}";
JObject root = JObject.Parse(json);
dynamic pcstation = root["PC_Station"];
for(int x = 0; x < pcstation.Count; x++)
{
Console.WriteLine(pcstation[x]);
}
Console.ReadLine();
}
在 for 循环中仅打印 x 时,我得到 0 和 1 作为输出,这意味着有 2 个项目,即 PC_station 下阵列中的两个 PLC 设备。我觉得我快到了。
我希望任何人都可以帮助我弄清楚我需要做什么,因为我几乎无能为力。
编辑 1:似乎我不太清楚我想要什么,你看,我收到的示例 JSON 代码来自两个随机 PLC 设备。每个 PLC 都有自己的变量,因此我不能使用由 json2csharp 生成的类。我想动态反序列化并使用从服务器收到的变量在 Unity 中可视化它们。
解决方案
您可以使用 Newtonsoft.json
string line = "{\"PC_Station\": [{\"PLC_0\": {\"DB1\": {\"test123\": 0}, \"STOP\": false, \"START\": false, \"Start_1\": false, \"Stop_1\": false, \"Led1\": true, \"Led2\": false, \"Led3\": true, \"Counter\": 4002, \"Sliderval\": 0}},{\"PLC_1\": {\"DB1\": {\"test123\": 0}, \"STOP\": false, \"START\": false, \"Start_1\": false, \"Stop_1\": false, \"Led1\": true, \"Led2\": false, \"Led3\": true, \"Counter\": 4002, \"Sliderval\": 0}}]}";
var files = JObject.Parse(line);
var recList = files.SelectToken("$..PC_Station").ToList();
foreach (var item in recList)
{
for (int i = 0; i < item.Count(); i++)
{
Console.WriteLine(recList[i]);
}
}
推荐阅读
- javascript - Javascript 使用过滤器问题过滤对象数组
- haskell - 模式匹配是多余的,haskell
- sharepoint - 将 Power BI 连接到 SharePoint
- ansible - 使用 ansible-vault 部署敏感数据
- json - 如何反序列化 JSON 并将特定的字符串值对序列化为不同的 JSON?
- elasticsearch - Logstash:错误:尝试运行 logstash.bat 时无法找到或加载主类堆栈
- python - xy 在 txt 文件的一行中出现的频率是多少?在 Python 中
- excel - VBA Find .address 有时返回范围,有时返回单元格
- node.js - catch(err) 给出错误但不在节点 express js 的异步函数中返回对象数据
- c# - 防止 AuthenticationState 删除添加到 ClaimsPrincipal 的声明