首页 > 解决方案 > 反序列化 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 中可视化它们。

标签: c#jsonjson.netdeserialization

解决方案


您可以使用 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]);
        }
    }

推荐阅读