Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化复杂JSON_C#_Json_Json.net_Deserialization - Fatal编程技术网

C# 反序列化复杂JSON

C# 反序列化复杂JSON,c#,json,json.net,deserialization,C#,Json,Json.net,Deserialization,我正在尝试反序列化以下JSON字符串: 我通常在:的帮助下创建类,然后我会做类似的事情(Json.NET libary): 折叠|复制代码 var result = JsonConvert.DeserializeObject<MyObject>(jsonString); var result=JsonConvert.DeserializeObject(jsonString); 但是在获取JSON字符串之前,设备的数量及其名称(例如:ASTEALTHYNODE01\u 0\u 0

我正在尝试反序列化以下JSON字符串:

我通常在:的帮助下创建类,然后我会做类似的事情(Json.NET libary): 折叠|复制代码

var result = JsonConvert.DeserializeObject<MyObject>(jsonString);
var result=JsonConvert.DeserializeObject(jsonString);
但是在获取JSON字符串之前,设备的数量及其名称(例如:ASTEALTHYNODE01\u 0\u 0\u 11)是未知的。我如何将其反序列化

谢谢您

您的json“data”属性看起来像类型为Dictionary的属性,其中SomeClass-是

    {
        "css_class": "sensor rf digital humidity",
// skipped
       "subDevices": {},
        "vid": "0"
    },

数据结构,因此您可以在MyObject类中定义此属性,并使用强类型反序列化,而不会出现任何问题。

这对我、您的JSON和JSON.NET都适用:

        Payload payloadJsonNet = JsonConvert.DeserializeObject<Payload>(data);
        System.Diagnostics.Debug.Assert
        (
            payloadJsonNet.data.ContainsKey("ASTEALTHYNODE01_0_0_11") &&
            payloadJsonNet.data["ASTEALTHYNODE01_0_0_11"].subDevices.ContainsKey("6l8At") &&
            payloadJsonNet.data["ASTEALTHYNODE01_0_0_11"].subDevices["6l8At"].shortName == "Door Bell"
        );
最后,对于好奇的人来说,反序列化也很好:

        Payload payloadMyParser = new JsonParser().Parse<Payload>(data);
        System.Diagnostics.Debug.Assert
        (
            payloadMyParser.data.ContainsKey("ASTEALTHYNODE01_0_0_11") &&
            payloadMyParser.data["ASTEALTHYNODE01_0_0_11"].subDevices.ContainsKey("6l8At") &&
            payloadMyParser.data["ASTEALTHYNODE01_0_0_11"].subDevices["6l8At"].shortName == "Door Bell"
        );
Payload payloadMyParser=new JsonParser().Parse(数据);
System.Diagnostics.Debug.Assert
(
payloadMyParser.data.ContainsKey(“ASTEALTHYNODE01\u 0\u 0\u 11”)&&
payloadMyParser.data[“ASTEALTHYNODE01\u 0\u 0\u 11”]子设备.ContainsKey(“6l8At”)&&
payloadMyParser.data[“ASTEALTHYNODE01\u 0\u 0\u 11”]。子设备[“6l8At”]。shortName==“门铃”
);

'希望这有帮助,

您是否考虑过创建一个循环,将每个循环发送到代码隐藏,并将反序列化对象存储在列表(类型)属性中?虽然您的目标是.NET framework的最新版本,但不确定是否可以将该道具存储在viewstate中,这可能是将JSON反序列化为
动态
对象(
dynamic result=JsonConvert.DeserializeObject(jsonString);
)有意义的情况之一。对不起,我不明白。你能编一些伪代码或更详细地解释一下吗?感谢you@MauroCerutt动态对象看起来非常有趣!我要试一试。谢谢,我还以为你在用“动态”对象呢。我应该解释一下,我没有将此作为答案发布的唯一原因是因为我使用newtonsoft的JSON.net框架才几个月,它是针对VB.net的,而且我还没有对它进行过太多的研究(所以我不知道所有的术语、技巧等)。目前,我使用它来克服ASP.NET Web API无法接受post操作的多个参数。相反,我只使用一个参数(一个字符串化的JSON对象),然后反序列化它来访问我的所有属性。
    public class Payload
    {
        public int result { get; set; }
        public int id { get; set; }
        public Error error { get; set; }
        public Dictionary<string, Device> data { get; set; }
    }

    public class Device
    {
        public string css_class { get; set; }
        public string default_name { get; set; }
        public string device_type { get; set; }
        public string did { get; set; }
        public string gid { get; set; }
        public int has_subdevice_count { get; set; }
        public int has_time_series { get; set; }
        public int is_actuator { get; set; }
        public int is_sensor { get; set; }
        public int is_silent { get; set; }
        public LastData last_data { get; set; }
        public Meta meta { get; set; }
        public string node { get; set; }
        public string shortName { get; set; }
        public Dictionary<string, Device> subDevices { get; set; }
        public string vid { get; set; }
    }

    public class LastData
    {
        public string DA { get; set; }
        public long timestamp { get; set; }
    }

    public class Meta
    {
    }

    public class Error
    {
    }
    public class LastData
    {
        public string DA { get; set; }
        public long timestamp { get; set; }
    }
        Payload payloadMyParser = new JsonParser().Parse<Payload>(data);
        System.Diagnostics.Debug.Assert
        (
            payloadMyParser.data.ContainsKey("ASTEALTHYNODE01_0_0_11") &&
            payloadMyParser.data["ASTEALTHYNODE01_0_0_11"].subDevices.ContainsKey("6l8At") &&
            payloadMyParser.data["ASTEALTHYNODE01_0_0_11"].subDevices["6l8At"].shortName == "Door Bell"
        );