Реализация десериализации с помощью RestSharp и Newtonsoft.Json - PullRequest
0 голосов
/ 06 июня 2018

Я довольно новичок в c #, но я создаю что-то, чтобы помочь мне на работе.У нас есть REST API, к которому я пытаюсь подключиться, но у меня возникают проблемы с десериализацией ответа.Мой код:

namespace BSRestCleint
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string key = "xxxxxxxx";
        string endPoint = "https://api.broadsign.com:10889/rest";
        private void bRun_Click(object sender, EventArgs e)
        {
            var client = new RestClient(endPoint);
            var request = new RestRequest("/host/v14/by_id", Method.GET);
            request.AddHeader("accept", "application/json");
            request.AddHeader("Authorization", "Bearer " + key);
            request.AddParameter("domain_id", "103947039");
            request.AddParameter("ids", "195392183");
            request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
            request.RequestFormat = DataFormat.Json;
            var response = client.Execute<Host>(request);
            var host = JsonConvert.DeserializeObject<Host>(response.Content);
            oResponse.Text = host.Name;

        }
    }
}

И это мой класс:

namespace BSRestCleint
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
    using System.Runtime.Serialization.Json;
    using System.IO;

    public partial class Host
    {
        [JsonProperty("config_profile_bag_id")]
        public long ConfigProfileBagId { get; set; }

        [JsonProperty("container_id")]
        public long ContainerId { get; set; }

        [JsonProperty("db_pickup_tm_utc")]
        public string DbPickupTmUtc { get; set; }

        [JsonProperty("discovery_status")]
        public long DiscoveryStatus { get; set; }

        [JsonProperty("display_unit_id")]
        public long DisplayUnitId { get; set; }

        [JsonProperty("domain_id")]
        public long DomainId { get; set; }

        [JsonProperty("geolocation")]
        public string Geolocation { get; set; }

        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("nscreens")]
        public long Nscreens { get; set; }

        [JsonProperty("public_key_fingerprint")]
        public string PublicKeyFingerprint { get; set; }

        [JsonProperty("remote_clear_db_tm_utc")]
        public string RemoteClearDbTmUtc { get; set; }

        [JsonProperty("remote_reboot_tm_utc")]
        public string RemoteRebootTmUtc { get; set; }

        [JsonProperty("volume")]
        public long Volume { get; set; }
    }
}

Наконец, возвращается json:

{  
   "not_modified_since":"2018-06-05T22:22:18Z",
   "host":[  
      {  
         "active":true,
         "config_profile_bag_id":0,
         "container_id":0,
         "db_pickup_tm_utc":"2018-01-11T10:12:55",
         "discovery_status":0,
         "display_unit_id":0,
         "domain_id":103947039,
         "geolocation":"(0,0)",
         "id":195392183,
         "license_end_date":null,
         "licensed":true,
         "name":"Broadsign Services - Mathias - 16x64",
         "nscreens":0,
         "primary_mac_address":"00:0c:29:e0:e6:22",
         "public_key_fingerprint":"REDACTED",
         "remote_clear_db_tm_utc":"1970-01-01T00:00:00",
         "remote_reboot_tm_utc":"2017-12-12T10:17:23",
         "secondary_mac_address":"",
         "volume":-1
      }
   ]
}

Я знаю, что если я обработаю только эту частьмой код работает:

{  
     "active":true,
     "config_profile_bag_id":0,
     "container_id":0,
     "db_pickup_tm_utc":"2018-01-11T10:12:55",
     "discovery_status":0,
     "display_unit_id":0,
     "domain_id":103947039,
     "geolocation":"(0,0)",
     "id":195392183,
     "license_end_date":null,
     "licensed":true,
     "name":"Broadsign Services - Mathias - 16x64",
     "nscreens":0,
     "primary_mac_address":"00:0c:29:e0:e6:22",
     "public_key_fingerprint":"REDACTED",
     "remote_clear_db_tm_utc":"1970-01-01T00:00:00",
     "remote_reboot_tm_utc":"2017-12-12T10:17:23",
     "secondary_mac_address":"",
     "volume":-1
}

Я хотел бы знать, как я мог бы заставить мой код работать для всего json, чтобы мне не нужно было пересматривать возвращаемое значение.Некоторые ответы возвращают несколько экземпляров, в отличие от тех, где их только 1. Это, вероятно, очень простое решение, но мое понимание языка довольно незначительно, поскольку я новичок в этом.

Любая помощь будет принята.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Вы можете извлечь его следующим образом, не вводя новый класс:

var js = JObject.Parse(response.Content);
var hosts = JArray.Parse(obj["host"].ToString());
foreach (JObject host in hosts)
{
    var h = JsonConvert.DeserializeObject<Host>(host)
    //do what you need to do with host
}

Вы упомянули, что может быть несколько хостов, поэтому вам нужно преобразовать его в JArray и выполнить цикл по массиву.

0 голосов
/ 06 июня 2018

вместо этого используйте этот класс хоста (переименованный в RootObject)

    public partial class RootObject
    {
        [JsonProperty("not_modified_since")]
        public DateTimeOffset NotModifiedSince { get; set; }

        [JsonProperty("host")]
        public List<Host> Host { get; set; }
    }

    public partial class Host
    {
        [JsonProperty("active")]
        public bool Active { get; set; }

        [JsonProperty("config_profile_bag_id")]
        public long ConfigProfileBagId { get; set; }

        [JsonProperty("container_id")]
        public long ContainerId { get; set; }

        [JsonProperty("db_pickup_tm_utc")]
        public DateTimeOffset DbPickupTmUtc { get; set; }

        [JsonProperty("discovery_status")]
        public long DiscoveryStatus { get; set; }

        [JsonProperty("display_unit_id")]
        public long DisplayUnitId { get; set; }

        [JsonProperty("domain_id")]
        public long DomainId { get; set; }

        [JsonProperty("geolocation")]
        public string Geolocation { get; set; }

        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("license_end_date")]
        public object LicenseEndDate { get; set; }

        [JsonProperty("licensed")]
        public bool Licensed { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("nscreens")]
        public long Nscreens { get; set; }

        [JsonProperty("primary_mac_address")]
        public string PrimaryMacAddress { get; set; }

        [JsonProperty("public_key_fingerprint")]
        public string PublicKeyFingerprint { get; set; }

        [JsonProperty("remote_clear_db_tm_utc")]
        public DateTimeOffset RemoteClearDbTmUtc { get; set; }

        [JsonProperty("remote_reboot_tm_utc")]
        public DateTimeOffset RemoteRebootTmUtc { get; set; }

        [JsonProperty("secondary_mac_address")]
        public string SecondaryMacAddress { get; set; }

        [JsonProperty("volume")]
        public long Volume { get; set; }
    }
}

, затем десериализуйте

var rootObject = JsonConvert.DeserializeObject<RootObject>(response.Content);
var hosts = rootObject .Host;
0 голосов
/ 06 июня 2018

Поскольку вы получаете хост как массив внутри другого корневого объекта, так что вы можете определить новый класс, который будет упаковывать Host (массив)

public class RootObject
{
    public DateTime not_modified_since { get; set; }
    public List<Host> Host { get; set; }
}

код десериализации необходимо обновить как

var root = JsonConvert.DeserializeObject<RootObject>(response.Content);

Если вы видите, здесь произойдет десериализация для RootObject вместо Host.

Теперь, чтобы получить все хосты, используйте следующий код:

var hosts = root.Host;

Или первый хост из полученных хостов

var firstHost = root.Host.First();
...