从API响应中反序列化JSON [英] Deserialize JSON from API response

查看:149
本文介绍了从API响应中反序列化JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用称为"PRTG"的API,它是服务器监视服务.呼叫了设备上的所有传感器后,我在Fiddler中得到了以下响应:

I am using an API called "PRTG" that is a server monitoring service. After making a call for all sensors on a device, I get this response in 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 
    }
]
}

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

I've tried to create a class structure that follows this response. It looks like this:

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包装程序中的基本方法,该方法运行url查询并尝试将其反序列化为我选择的类(BasePrtgSensors). 实际的调用是这样的:

It's a base method that's in my WebClient Wrapper that runs the url-query and tries to deserialize it into the class I choose (BasePrtgSensors). The actual call is this:

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

在调用后,我从对象中获得的所有内容均为null和0值. 我很确定自己已经在类结构中搞砸了,但是我对序列化是全新的,而且我似乎无法找到为什么响应不会反序列化到我的类中的原因.

All I'm getting from my object is null and 0 values after the call. I am pretty sure that I've screwed up somewhere in the class-structure, but I'm completely new to serialization and I can't seem to find why the response won't deserialize into my class.

谢谢您的指导!

推荐答案

我刚刚在这里使用您的代码对它进行了测试.像这样使用它时,由于Dictionary<string, PrtgSensor>,我得到了一个例外.

I've just tested it myself with your code there. I get an exception when using it like so, because of the Dictionary<string, PrtgSensor>.

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

But, like I said in my comment, if you use a List<PrtgSensor> instead, I get everything into one BasePrtgSensors object.

原因是json中的sensors是数组或列表.字典始终是键值对.

The reason is, that sensors in json is an array or a list. A dictionary is always a key value pair.

这篇关于从API响应中反序列化JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆