2013-12-20 141 views
1

我试图反序列化JSON以下字符串:反序列化JSON复杂

Link to JSON String

{ 
    "result": 1, 
    "error": null, 
    "id": 0, 
    "data": { 
    "ASTEALTHYNODE01_0301_0_30": { 
     "css_class": "sensor rf digital humidity", 
     "default_name": "Humidity", 
     "device_type": "humidity", 
     "did": "30", 
     "gid": "0301", 
     "has_subdevice_count": 0, 
     "has_time_series": 1, 
     "is_actuator": 0, 
     "is_sensor": 1, 
     "is_silent": 0, 
     "last_data": { 
      "DA": 58, 
      "timestamp": 1355791804474 
     }, 
     "meta": {}, 
     "node": "ASTEALTHYNODE01", 
     "shortName": "Humidity", 
     "subDevices": {}, 
     "vid": "0" 
    }, 
    "ASTEALTHYNODE01_0301_0_31": { 
     "css_class": "sensor rf digital temperature", 
     "default_name": "Temperature", 
     "device_type": "temperature", 
     "did": "31", 
     "gid": "0301", 
     "has_subdevice_count": 0, 
     "has_time_series": 1, 
     "is_actuator": 0, 
     "is_sensor": 1, 
     "is_silent": 0, 
     "last_data": { 
      "DA": 26.6, 
      "timestamp": 1355791804475 
     }, 
     "meta": {}, 
     "node": "ASTEALTHYNODE01", 
     "shortName": "Temperature", 
     "subDevices": {}, 
     "vid": "0" 
    }, 
    "ASTEALTHYNODE01_0_0_1000": { 
     "css_class": "actuator cape led rgbled", 
     "default_name": "On Board RGB LED", 
     "device_type": "rgbled", 
     "did": "1000", 
     "gid": "0", 
     "has_subdevice_count": 0, 
     "has_time_series": 0, 
     "is_actuator": 1, 
     "is_sensor": 1, 
     "is_silent": 0, 
     "last_data": { 
      "DA": "22B42B", 
      "timestamp": 1355790209080 
     }, 
     "meta": {}, 
     "node": "ASTEALTHYNODE01", 
     "shortName": "On Board RGB LED", 
     "subDevices": {}, 
     "vid": "0" 
    }, 
    "ASTEALTHYNODE01_0_0_11": { 
     "css_class": "sensor serial rf rf433 receiver transmitter", 
     "default_name": "RF 433Mhz", 
     "device_type": "rf433", 
     "did": "11", 
     "gid": "0", 
     "has_subdevice_count": 1, 
     "has_time_series": 0, 
     "is_actuator": 1, 
     "is_sensor": 1, 
     "is_silent": 0, 
     "last_data": { 
      "DA": "010001010101010100010101", 
      "timestamp": 1355789891324 
     }, 
     "meta": {}, 
     "node": "ASTEALTHYNODE01", 
     "shortName": "RF 433Mhz", 
     "subDevices": { 
      "6l8At": { 
       "category": "rf", 
       "data": "011111110001010100110000", 
       "shortName": "Door Bell", 
       "type": "sensor" 
      } 
     }, 
     "vid": "0" 
    } 
    } 
} 

我通常的帮助下创建类:http://json2csharp.com,然后我做这样的事情(Json.NET libary): Collapse |复制代码

var result = JsonConvert.DeserializeObject<MyObject>(jsonString); 

但设备的数量和它们的名字(例如:ASTEALTHYNODE01_0_0_11)是未知之前,我的JSON字符串。我怎样才能反序列化呢?

谢谢

+0

您是否考虑过创建一个循环,将每个循环发送给代码隐藏并将反序列化的对象存储在一个(类型)属性列表中?不知道你是否可以在视图状态下存储道具 – Lopsided

+0

你是针对.NET框架的最新版本的,这可能是将JSON反序列化为“动态”对象(“ ''动态结果= JsonConvert.DeserializeObject(jsonString);''') –

+0

@Lopsided很抱歉,但我不明白。你可以写一些伪代码还是更详细地解释它?谢谢 – user3123001

回答

0

这个工作对我来说,你的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" 
     ); 

...你准备了以下波苏斯提供(使用漂亮json2csharp帮手,例如):

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 
    { 
    } 

我想你必须从其他JSON输入中找出/推断这些最后两个家伙的属性(即“Meta”和“Error”)。

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

最后,只为好奇,my own parser反序列化精细以及:

 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" 
     ); 

“希望这

还要注意,在使用需要 “长” 型有帮助,

0

您的JSON“数据”属性看起来像型词典<串,SomeClass的>,其中SomeClass的财产 - 是

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

数据结构的一类,所以你可以定义此MyObject类中的属性,并使用强类型的反序列化没有任何问题。