C# 从API响应反序列化JSON

C# 从API响应反序列化JSON,c#,json,serialization,prtg,C#,Json,Serialization,Prtg,我正在使用一个名为“PRTG”的API,这是一个服务器监控服务。在调用设备上的所有传感器后,我在Fiddler中得到以下响应: { "prtg-version": "14.2.10.2114", "treesize": 6, "sensors": [ { "objid": 6277, "probe": "Koneo Kalmar AB", "group": "Koneo Kalmar home", "device": "bl

我正在使用一个名为“PRTG”的API,这是一个服务器监控服务。在调用设备上的所有传感器后,我在Fiddler中得到以下响应:

{
"prtg-version": "14.2.10.2114",
"treesize": 6,
"sensors": [
    {
        "objid": 6277,
        "probe": "Koneo Kalmar AB",
        "group": "Koneo Kalmar home",
        "device": "bl0615.systempartner.local",
        "sensor": "Disk Space",
        "status": "Up",
        "status_raw": 3,
        "message": "<div class=\"status\">OK<div class=\"moreicon\"></div></div>",
        "message_raw": "OK",
        "lastvalue": "21 %",
        "lastvalue_raw": 21.0000,
        "priority": 4,
        "favorite": "<span class=\"objectisnotfavorite icon-gray ui-icon ui-icon-flag\" id=\"fav-6277\" onclick=\"_Prtg.objectTools.faveObject.call(this,6277,&apos;toggle&apos;);return false;\"></span>",
        "favorite_raw": 0
    },
    {
        "objid": 6279,
        "probe": "Koneo Kalmar AB",
        "group": "Koneo Kalmar home",
        "device": "bl0615.systempartner.local",
        "sensor": "PING",
        "status": "Up",
        "status_raw": 3,
        "message": "<div class=\"status\">OK<div class=\"moreicon\"></div></div>",
        "message_raw": "OK",
        "lastvalue": "0 msec",
        "lastvalue_raw": 0.0000,
        "priority": 5,
        "favorite": "<span class=\"objectisnotfavorite icon-gray ui-icon ui-icon-flag\" id=\"fav-6279\" onclick=\"_Prtg.objectTools.faveObject.call(this,6279,&apos;toggle&apos;);return false;\"></span>",
        "favorite_raw": 0
    },
    {
        "objid": 6280,
        "probe": "Koneo Kalmar AB",
        "group": "Koneo Kalmar home",
        "device": "bl0615.systempartner.local",
        "sensor": "DNS",
        "status": "Up",
         "status_raw": 3,
        "message": "<div class=\"status\">OK: 127.0.0.1<div class=\"moreicon\"></div></div>",
        "message_raw": "OK: 127.0.0.1",
        "lastvalue": "0 msec",
        "lastvalue_raw": 0.0000,
        "priority": 3,
        "favorite": "<span class=\"objectisnotfavorite icon-gray ui-icon ui-icon-flag\" id=\"fav-6280\" onclick=\"_Prtg.objectTools.faveObject.call(this,6280,&apos;toggle&apos;);return false;\"></span>",
        "favorite_raw": 0
    },
    {
        "objid": 6799,
        "probe": "Koneo Kalmar AB",
        "group": "Koneo Kalmar home",
        "device": "bl0615.systempartner.local",
         "sensor": "Disk Free: C:\\ Label:  Serial Number 34fe9d97", "status": "Up", "status_raw": 3,
        "message": "<div class=\"status\">OK<div class=\"moreicon\"></div></div>",
        "message_raw": "OK",
        "lastvalue": "21 %",
        "lastvalue_raw": 21.2458,
        "priority": 3,
        "favorite": "<span class=\"objectisnotfavorite icon-gray ui-icon ui-icon-flag\" id=\"fav-6799\" onclick=\"_Prtg.objectTools.faveObject.call(this,6799,&apos;toggle&apos;);return false;\"></span>",
        "favorite_raw": 0
    },
    {
        "objid": 6800,
        "probe": "Koneo Kalmar AB",
        "group": "Koneo Kalmar home",
        "device": "bl0615.systempartner.local",
         "sensor": "Disk Free: D:\\ Label:DATA  Serial Number 44bc0bc3", "status": "Up",
        "status_raw": 3,
        "message": "<div class=\"status\">OK<div class=\"moreicon\"></div></div>",
        "message_raw": "OK",
        "lastvalue": "49 %",
        "lastvalue_raw": 49.4901,
        "priority": 3,
        "favorite": "<span class=\"objectisnotfavorite icon-gray ui-icon ui-icon-flag\" id=\"fav-6800\" onclick=\"_Prtg.objectTools.faveObject.call(this,6800,&apos;toggle&apos;);return false;\"></span>",
        "favorite_raw": 0
    },
    {
        "objid": 6801,
        "probe": "Koneo Kalmar AB",
        "group": "Koneo Kalmar home",
        "device": "bl0615.systempartner.local",
         "sensor": "SNMP HP Proliant System Health 1", "status": "Warning", "status_raw": 4,
        "message": "<div class=\"status\">Warning in Disk Controller Status: &#39;Degraded&#39;<div class=\"moreicon\"></div></div>",
        "message_raw": "Warning in Disk Controller Status: &apos;Degraded&apos;",
        "lastvalue": "2 #",
        "lastvalue_raw": 2.0000,
        "priority": 3,
        "favorite": "<span class=\"objectisnotfavorite icon-gray ui-icon ui-icon-flag\" id=\"fav-6801\" onclick=\"_Prtg.objectTools.faveObject.call(this,6801,&apos;toggle&apos;);return false;\"></span>",
        "favorite_raw": 0 
    }
]
}
{
“prtg版本”:“14.2.10.2114”,
“树化”:6,
“传感器”:[
{
“目标”:6277,
“探测器”:“科内奥·卡马尔AB”,
“集团”:“科内奥·卡尔马之家”,
“设备”:“bl0615.systempartner.local”,
“传感器”:“磁盘空间”,
“状态”:“向上”,
“原始状态”:3,
“消息”:“确定”,
“原始消息”:“确定”,
“lastvalue”:“21%”,
“lastvalue_原始值”:21.0000,
“优先”:4,
“收藏”:“,
“最喜爱的未加工”:0
},
{
“目标”:6279,
“探测器”:“科内奥·卡马尔AB”,
“集团”:“科内奥·卡尔马之家”,
“设备”:“bl0615.systempartner.local”,
“传感器”:“PING”,
“状态”:“向上”,
“原始状态”:3,
“消息”:“确定”,
“原始消息”:“确定”,
“lastvalue”:“0毫秒”,
“lastvalue_原始值”:0.0000,
“优先”:5,
“收藏”:“,
“最喜爱的未加工”:0
},
{
“目标”:6280,
“探测器”:“科内奥·卡马尔AB”,
“集团”:“科内奥·卡尔马之家”,
“设备”:“bl0615.systempartner.local”,
“传感器”:“DNS”,
“状态”:“向上”,
“原始状态”:3,
“消息”:“确定:127.0.0.1”,
“原始消息”:“确定:127.0.0.1”,
“lastvalue”:“0毫秒”,
“lastvalue_原始值”:0.0000,
“优先”:3,
“收藏”:“,
“最喜爱的未加工”:0
},
{
“目标”:6799,
“探测器”:“科内奥·卡马尔AB”,
“集团”:“科内奥·卡尔马之家”,
“设备”:“bl0615.systempartner.local”,
“传感器”:“磁盘空闲:C:\\标签:序列号34fe9d97”,“状态”:“启动”,“状态\原始”:3,
“消息”:“确定”,
“原始消息”:“确定”,
“lastvalue”:“21%”,
“lastvalue_raw”:21.2458,
“优先”:3,
“收藏”:“,
“最喜爱的未加工”:0
},
{
“目标”:6800,
“探测器”:“科内奥·卡马尔AB”,
“集团”:“科内奥·卡尔马之家”,
“设备”:“bl0615.systempartner.local”,
“传感器”:“磁盘空闲:D:\\标签:数据序列号44bc0bc3”,“状态”:“启动”,
“原始状态”:3,
“消息”:“确定”,
“原始消息”:“确定”,
“lastvalue”:“49%”,
“lastvalue_原始值”:49.4901,
“优先”:3,
“收藏”:“,
“最喜爱的未加工”:0
},
{
“目标”:6801,
“探测器”:“科内奥·卡马尔AB”,
“集团”:“科内奥·卡尔马之家”,
“设备”:“bl0615.systempartner.local”,
“传感器”:“SNMP HP Proliant系统运行状况1”,“状态”:“警告”,“原始状态”:4,
“消息”:“磁盘控制器状态中的警告:';降级';”,
“消息_raw”:“磁盘控制器状态中的警告:&apos;降级”,
“lastvalue”:“2#”,
“lastvalue_原始值”:2.0000,
“优先”:3,
“收藏”:“,
“最喜爱的未加工”:0
}
]
}
我试图创建一个类结构,它遵循这个响应。看起来是这样的:

public class BasePrtgSensors
{
    [JsonProperty("prtg-version")]
    public string PrtgVersion { get; set; }
    [JsonProperty("sensors")]
    public Dictionary<string, PrtgSensor> Sensors { get; set; }
    [JsonProperty("treesize")]
    public string TreeSize { get; set; }
}

public class PrtgSensor
{
    [JsonProperty("objid")]
    public string Id { get; set; }
    [JsonProperty("probe")]
    public string Probe { get; set; }
    [JsonProperty("group")]
    public string Group { get; set; }
    [JsonProperty("device")]
    public string Device { get; set; }
    [JsonProperty("sensor")]
    public string Sensor { get; set; }
    [JsonProperty("status")]
    public string Status { get; set; }
    [JsonProperty("status_raw")]
    public string StatusRaw { get; set; }
    [JsonProperty("message")]
    public string Message { get; set; }
    [JsonProperty("message_raw")]
    public string MessageRaw { get; set; }
    [JsonProperty("lastvalue")]
    public string LastValue { get; set; }
    [JsonProperty("lastvalue_raw")]
    public string LastValueRaw { get; set; }
    [JsonProperty("priority")]
    public string Priority { get; set; }
    [JsonProperty("favorite")]
    public string Favorite { get; set; }
    [JsonProperty("favorite_raw")]
    public string FavoriteRaw { get; set; }
}
公共类BasePrtgSensors
{
[JsonProperty(“prtg版本”)]
公共字符串PrtgVersion{get;set;}
[JsonProperty(“传感器”)]
公共字典传感器{get;set;}
[JsonProperty(“treesize”)]
公共字符串树大小{get;set;}
}
公共级PRTG传感器
{
[JsonProperty(“objid”)]
公共字符串Id{get;set;}
[JsonProperty(“probe”)]
公共字符串探测{get;set;}
[JsonProperty(“集团”)]
公共字符串组{get;set;}
[JsonProperty(“设备”)]
公共字符串设备{get;set;}
[JsonProperty(“传感器”)]
公共字符串传感器{get;set;}
[JsonProperty(“状态”)]
公共字符串状态{get;set;}
[JsonProperty(“原始状态”)]
公共字符串StatusRaw{get;set;}
[JsonProperty(“消息”)]
公共字符串消息{get;set;}
[JsonProperty(“消息_原始”)]
公共字符串MessageRaw{get;set;}
[JsonProperty(“lastvalue”)]
公共字符串LastValue{get;set;}
[JsonProperty(“lastvalue_raw”)]
公共字符串LastValueRaw{get;set;}
[JsonProperty(“优先权”)]
公共字符串优先级{get;set;}
[JsonProperty(“收藏夹”)]
公共字符串收藏夹{get;set;}
[JsonProperty(“favorite_raw”)]
公共字符串FavoriteRaw{get;set;}
}
我正在运行以下代码:

protected T Execute<T>(string urlSegment)
    {
        return JsonConvert.DeserializeObject<T>(Client().DownloadString(_baseUrl + '/' + urlSegment.TrimStart('/')));
    }
protectedt执行(字符串URLSEMENT)
{
返回JsonConvert.DeserializeObject(Client().DownloadString(_baseUrl+'/'+urlSegment.TrimStart('/'));
}
它是WebClient包装中的一个基本方法,运行url查询并尝试将其反序列化到我选择的类(BasePrtgSensors)中。 实际调用是这样的:

public BasePrtgSensors GetSensors(string id)
    {
        return Execute<BasePrtgSensors>(_resultType + _contentSensors + _output + _columnsSensors + "&id=" + id + _auth);
    }
public-BasePrtgSensors-GetSensors(字符串id)
{
返回Execute(_resultType+_contentSensors+_output+_columnsSensors+“&id=“+id+_auth”);
}
我从我的对象得到的只是null和调用后的0值。 我很确定我在类结构中的某个地方搞砸了,但是我对序列化是完全陌生的,我似乎不明白为什么响应不会反序列化到我的类中


提前感谢您的指导

我刚刚用你的代码亲自测试过。像这样使用它时,我会遇到一个异常,因为
字典

但是,正如我在评论中所说,如果您使用
列表
,我会将所有内容都放在一个
BasePrtgSensors
对象中


原因是,json中的传感器是数组或列表。字典始终是键值对。

是否是
BasePrtgSensors
类有
字典的问题?Json在那里只有一个数组。首先,我不知道
JsonConvert
。根据文档,我希望默认序列化程序设置会导致问题。他们说他们适用于这种方法