使用RestSharp和Newtonsoft.Json实现反序列化

时间:2018-06-06 10:22:27

标签: c# json rest deserialization restsharp

我对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,这样我就不需要regex返回值了。有些响应会返回多个实例,而不是那里只有1个。这可能是一个非常简单的解决方案,但我对语言的掌握相当微小,因为我是新手。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

因为,您将主机作为数组放在另一个根对象中,因此您可以定义一个包装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();

答案 1 :(得分:0)

您可以像这样提取它,而不引入新类:

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,并循环遍历该阵列。

答案 2 :(得分:0)

使用它作为您的Host类(重命名为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;