将JSON从GET请求转换为C#Winforms Application中的文本框

时间:2017-01-16 19:34:57

标签: c# json winforms api

我对C#很陌生,我正在寻求以下方面的帮助。

我写了一些代码(下面),利用公司的房屋API来获取与公司有关的信息。信息以JSON格式返回。

我需要做些什么来获取某些信息并将其放入我已经在表单上的文本框中。我写的代码可以工作,因为我可以在消息框中返回它,但我无法弄清楚如何将其填充到文本框中。

private void getFromCompaniesHouse(object sender, EventArgs e)
    {
        try
        {
            //Compile request url
            string url = "https://api.companieshouse.gov.uk/company/" + txtCompanyNumber.Text;

            // Encode API key to ASCII
            string api_key = "yfhOb66cRn7ZL1VgdFjVur5cs8u6j__bcNnKj9Qs:";
            string encodedKey = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(api_key));

            // Make get request using url and encoded API key
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.Headers.Add("Authorization", "Basic " + encodedKey);
            request.ContentType = "application/json; charset=utf-8";

            var response = (HttpWebResponse)request.GetResponse();

            using (var streamReader = new StreamReader(response.GetResponseStream()))
            {
                MessageBox.Show(streamReader.ReadToEnd());
            }
        }
        catch
        {
            MessageBox.Show("Cannot Make Request", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

返回的JSON如下所示:

{  
"accounts":{  
"accounting_reference_date":{  
"month":"12",
"day":"31"
},
"last_accounts":{  
"type":"group",
"made_up_to":"2015-12-31"
},
"next_made_up_to":"2016-12-31",
"next_due":"2017-09-30",
"overdue":false
},
"company_number":"08867781",
"annual_return":{  
"last_made_up_to":"2016-06-20",
"overdue":false
},
"jurisdiction":"england-wales",
"has_been_liquidated":false,
"date_of_creation":"2014-01-29",
"undeliverable_registered_office_address":false,
"company_name":"VIRGIN ATLANTIC LIMITED",
"registered_office_address":{  
"address_line_2":"Fleming Way",
"locality":"Crawley",
"country":"United Kingdom",
"region":"West Sussex",
"address_line_1":"Company Secretariat - The VHQ",
"postal_code":"RH10 9DF"
},
"type":"ltd",
"last_full_members_list_date":"2016-06-20",
"sic_codes":[  
"70100"
],
"has_insolvency_history":false,
"etag":"cbab10bb8b9dc1db442cb585a63ae208c1265100",
"company_status":"active",
"has_charges":false,
"previous_company_names":[  
{  
"name":"VIRGIN ATLANTIC (HOLDINGS) LIMITED",
"effective_from":"2014-01-29",
"ceased_on":"2014-05-30"
}
],
"confirmation_statement":{  
"next_made_up_to":"2017-06-20",
"overdue":false,
"next_due":"2017-07-04"
},
"links":{  
"self":"/company/08867781",
"filing_history":"/company/08867781/filing-history",
"officers":"/company/08867781/officers"
},
"registered_office_is_in_dispute":false,
"can_file":true
}

**更新**

我已将代码更新为以下内容:

private void getFromCompaniesHouse(object sender, EventArgs e)
    {
        try
        {
            //Compile request url
            string url = "https://api.companieshouse.gov.uk/company/" + txtCompanyNumber.Text;

            // Encode API key to ASCII
            string api_key = "yfhOb66cRn7ZL1VgdFjVur5cs8u6j__bcNnKj9Qs:";
            string encodedKey = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(api_key));

            // Make get request using url and encoded API key
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.Headers.Add("Authorization", "Basic " + encodedKey);
            request.ContentType = "application/json; charset=utf-8";

            var response = (HttpWebResponse)request.GetResponse();
            var rawJson = new StreamReader(response.GetResponseStream()).ReadToEnd();

            var json = JObject.Parse(rawJson);  //Turns your raw string into a key value lookup
            string company_name = json["company_name"].ToObject<string>();

            txtBusinessName.Text = company_name;

        }
        catch
        {
            MessageBox.Show("Cannot Make Request", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

我可以从RootObject类中提取内容但无法访问其他任何内容,例如在RegisteredOfficeAddress类中。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个访问公司信息的示例控制台应用程序(使用JSON.NET):

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var task = GetFromCompaniesHouse();

            task.Wait();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static async Task GetFromCompaniesHouse()
        {
            var url = "https://api.companieshouse.gov.uk/company/08867781";
            var apiKey = "yfhOb66cRn7ZL1VgdFjVur5cs8u6j__bcNnKj9Qs:";
            var encodedKey = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(apiKey));

            using (var client = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Get, url);

                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                request.Headers.Add("Authorization", $"Basic {encodedKey}");

                var response = await client.SendAsync(request);
                var content = await response.Content.ReadAsStringAsync();
                var company = JsonConvert.DeserializeObject<Company>(content);

                Console.WriteLine($"Company: {company.company_name}");
            }
        }
    }

    public class LastAccounts
    {
        public string made_up_to { get; set; }
        public string type { get; set; }
    }

    public class AccountingReferenceDate
    {
        public string month { get; set; }
        public string day { get; set; }
    }

    public class Accounts
    {
        public LastAccounts last_accounts { get; set; }
        public string next_due { get; set; }
        public bool overdue { get; set; }
        public string next_made_up_to { get; set; }
        public AccountingReferenceDate accounting_reference_date { get; set; }
    }

    public class RegisteredOfficeAddress
    {
        public string region { get; set; }
        public string locality { get; set; }
        public string address_line_2 { get; set; }
        public string postal_code { get; set; }
        public string address_line_1 { get; set; }
    }

    public class PreviousCompanyName
    {
        public string effective_from { get; set; }
        public string name { get; set; }
        public string ceased_on { get; set; }
    }

    public class ConfirmationStatement
    {
        public string last_made_up_to { get; set; }
        public string next_made_up_to { get; set; }
        public string next_due { get; set; }
        public bool overdue { get; set; }
    }

    public class Links
    {
        public string self { get; set; }
        public string filing_history { get; set; }
        public string officers { get; set; }
        public string charges { get; set; }
    }

    public class Company
    {
        public Accounts accounts { get; set; }
        public string company_name { get; set; }
        public bool has_been_liquidated { get; set; }
        public RegisteredOfficeAddress registered_office_address { get; set; }
        public string status { get; set; }
        public string last_full_members_list_date { get; set; }
        public string date_of_creation { get; set; }
        public List<string> sic_codes { get; set; }
        public bool undeliverable_registered_office_address { get; set; }
        public string type { get; set; }
        public string company_number { get; set; }
        public string jurisdiction { get; set; }
        public bool has_insolvency_history { get; set; }
        public string etag { get; set; }
        public string company_status { get; set; }
        public bool has_charges { get; set; }
        public List<PreviousCompanyName> previous_company_names { get; set; }
        public ConfirmationStatement confirmation_statement { get; set; }
        public Links links { get; set; }
        public bool registered_office_is_in_dispute { get; set; }
        public bool can_file { get; set; }
    }
}