【问题标题】:Implementing deserialization with RestSharp and Newtonsoft.Json使用 RestSharp 和 Newtonsoft.Json 实现反序列化
【发布时间】:2018-06-06 10:22:27
【问题描述】:

我对 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 个。这可能是一个非常简单的解决方案,但我对语言的掌握相当微不足道,因为我是新手。

任何帮助将不胜感激。

【问题讨论】:

    标签: json deserialization restsharp dooh broadsign


    【解决方案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();
    

    【讨论】:

    • 当我尝试使用这个来获取上面的所有主机时: var response = client.Execute(request); var root = JsonConvert.DeserializeObject(response.Content); var hosts = root.Host; listBox1.DataSource = root.Host;添加您的公共类 RootObject 后,我​​将 BSRestCleint.Host 返回给我。
    • ` var response = client.Execute(request); var root = JsonConvert.DeserializeObject(response.Content); var hosts = root.Host; listBox1.DataSource = root.Host; ` 不返回任何主机,只返回这一行:BSRestCleint.Host
    • 检查这个现场小提琴 - dotnetfiddle.net/5AOq6t 。我可以看到 json 是反序列化的属性。你能检查一下分配给 DataSouce 是否会造成这个问题?
    • 现在可以使用了!谢谢!我能够从主机中拉出一个元素。
    • 最后一个问题,如果您想进一步提供帮助。如果我想说生成一个表,其中一侧是键,另一侧是值,我将如何在能够处理多个主机的同时做到这一点?
    【解决方案2】:

    你可以这样提取它,而不需要引入新的类:

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

    【讨论】:

      【解决方案3】:

      将其用作您的主机类(重命名为 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多