【问题标题】:Deserialize JSON from API response从 API 响应反序列化 JSON
【发布时间】:2015-04-19 08:02:54
【问题描述】:

我正在使用一个名为“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 
    }
]
}

我尝试创建一个遵循此响应的类结构。它看起来像这样:

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

我正在运行这段代码:

protected T Execute<T>(string urlSegment)
    {
        return JsonConvert.DeserializeObject<T>(Client().DownloadString(_baseUrl + '/' + urlSegment.TrimStart('/')));
    }

这是我的 WebClient Wrapper 中的一个基本方法,它运行 url-query 并尝试将其反序列化为我选择的类 (BasePrtgSensors)。 实际调用是这样的:

public BasePrtgSensors GetSensors(string id)
    {
        return Execute<BasePrtgSensors>(_resultType + _contentSensors + _output + _columnsSensors + "&id=" + id + _auth);
    }

我从我的对象中得到的只是调用后的 null 和 0 值。 我很确定我在类结构中的某个地方搞砸了,但我对序列化完全陌生,我似乎无法找到为什么响应不会反序列化到我的类中。

提前感谢您的指导!

【问题讨论】:

  • 可能是您的BasePrtgSensors 类有Dictionary&lt;string, PrtgSensor&gt; 的问题吗? Json 确实只有一个数组。
  • 一开始我不知道JsonConvert。根据文档,我希望默认的序列化程序设置会导致问题。他们说他们适用于JsonConvert的方法。也许默认设置不会检查您的 [fieldName] 注释,并且需要以大写字母开头的字段名称。尝试手动创建序列化程序或更改默认设置。但是,您有任何异常消息可以用来查找问题吗?
  • @SebastianSchlicht 确实如此。 JsonConvert 是 Json.net 中反序列化 Json 的默认方式。我已经用他的代码对此进行了测试。看我的回答。实际上应该有一个例外。至少我得到了一个。

标签: c# json serialization prtg


【解决方案1】:

我刚刚用你的代码亲自测试了它。由于Dictionary&lt;string, PrtgSensor&gt;,我在这样使用它时遇到异常。

但是,就像我在评论中所说的那样,如果您改用 List&lt;PrtgSensor&gt;,我会将所有内容都放入一个 BasePrtgSensors 对象中。

原因是,json中的sensors是一个数组或者一个列表。字典始终是键值对。

【讨论】:

  • 啊哈,我一定会尝试将其设为列表。运行此代码时,我自己没有任何异常。不过,当我尝试连接 https 时,我确实得到了一个。
  • 我只拿了你提供的json。很可能,您通过网络服务获得的内容是空的,因此只是您的类的默认实例。 (这里不确定)至少,我可以反序列化提供的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多