2015-04-19 7 views
1

Я использую API под названием PRTG, который является службой мониторинга сервера. После посылки вызова для всех датчиков на устройстве, я получаю этот ответ в Fiddler:Deserialize JSON из ответа API

{ 
"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 обертке, которая работает с URL-запрос и пытается десериализации его в классе I выберите (BasePrtgSensors). Фактический вызов заключается в следующем:

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

Все, что я получаю от моего объекта равна нулю и 0 значения после вызова. Я вполне уверен, что я где-то в классе, но я совершенно не знаком с сериализацией, и я не могу понять, почему ответ не будет десериализоваться в моем классе.

Заранее благодарим за любые указания!

+0

Может быть проблема с вашим классом «BasePrtgSensors», который имеет «Словарь '? У Json есть только массив. –

+0

Сначала я не знаю 'JsonConvert'. Согласно документам, я ожидал, что настройки сериализатора по умолчанию вызовут проблемы. Говорят, что они применяются к методам 'JsonConvert'. Возможно, настройки по умолчанию не проверяют аннотации '[fieldName]' и ожидают имена полей, начиная с буквы верхнего регистра. Попробуйте создать сериализатор вручную или изменить настройки по умолчанию. Однако есть ли у вас какое-либо сообщение об исключении, которое мы могли бы использовать, чтобы найти проблему? –

+0

@SebastianSchlicht Это на самом деле. JsonConvert является стандартным способом десериализации Json в Json.net. Я проверил это с его кодом. См. Мой ответ. На самом деле должно быть исключение. По крайней мере, у меня есть. –

ответ

2

Я только что проверил его с вашим кодом. Я получаю исключение, когда использую его так, из-за Dictionary<string, PrtgSensor>.

Но, как я уже сказал в своем комментарии, если вы используете List<PrtgSensor>, я получаю все в одном объекте BasePrtgSensors.

Причина в том, что sensors в json - это массив или список. Словарь всегда является ключевой парой значений.

+0

Ага, я обязательно попробую сделать его списком. Я сам не получаю никаких исключений при запуске этого кода. Я получил один, когда пытался связаться с https. –

+0

Я только взял json, который вы предоставили. Вполне возможно, что то, что вы получаете через webservice, пуст и, следовательно, просто экземпляр по умолчанию вашего класса. (не уверен здесь) По крайней мере, я мог бы десериализовать предоставленную строку. –

+0

Да! Спасибо огромное! Это сработало как шарм :) –