0

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

任何帮助,将不胜感激。

4

3 回答 3

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();
于 2018-06-06T10:26:12.817 回答
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,并循环遍历该数组。

于 2018-06-06T10:40:52.863 回答
0

将其用作您的主机类(重命名为 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;
于 2018-06-06T11:18:41.273 回答