簡體   English   中英

根據從HttpWebResponse檢索的JSON數據創建C#對象

[英]Creating C# object from JSON data retrieved from HttpWebResponse

首先,我在編程方面絕對糟糕。 我一直都來過 世界上任何其他人似乎“得到”的最簡單,最瑣碎的事情都會使我絆倒,並導致我放棄無法控制的憤怒。 順便說一句,抱歉這個愚蠢的問題。 :P

我基本上是想從HttpWebResponse返回一些JSON值,並將它們放入C#對象中。 JSON值與客戶端列表有關。 我希望能夠將它們轉換為C#對象,然后可以在整個程序中使用(例如client.name,client.phone_number等)。

與最終代碼相比,下面的代碼更多是概念驗證。 我登錄到WordPress網站,然后從網站頁面上提取JSON數據。 我能夠檢索並查看返回的JSON數據(作為一個長亂字符串)。 我只是無法弄清楚如何從該字符串中提取我需要從中創建“客戶端”對象的特定值。

        string loginUri = "URL TO WORDPRESS LOGIN";
        string username = entryUsername;
        string password = entryPassword;
        string reqString = "log=" + username + "&pwd=" + password;
        byte[] requestData = Encoding.UTF8.GetBytes(reqString);

        CookieContainer loginCookie = new CookieContainer();
        var request = (HttpWebRequest)WebRequest.Create(loginUri);
        request.Proxy = null;
        request.AllowAutoRedirect = false;
        request.CookieContainer = loginCookie;
        request.Method = "POST";

        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = requestData.Length;
        using (Stream s = request.GetRequestStream())
        {
            s.Write(requestData, 0, requestData.Length);

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                foreach (Cookie currentCookie in response.Cookies)
                {
                    Console.WriteLine(currentCookie.Name + " = " + currentCookie.Value); // debug purposes
                    request.CookieContainer.Add(currentCookie);
                }
            }
        }

        // Debug purposes
        Console.WriteLine("{0} cookie(s) have been downloaded, Jim.", loginCookie.Count.ToString());

        string clientListURI = "PAGE CONTAINING JSON";
        HttpWebRequest clientListRequest = (HttpWebRequest)WebRequest.Create(clientListURI);
        clientListRequest.Proxy = null;
        clientListRequest.Method = "POST";
        clientListRequest.ContentLength = 0;
        clientListRequest.ContentType = "application/json";
        clientListRequest.CookieContainer = loginCookie;
        using (HttpWebResponse clientListResponse = (HttpWebResponse)clientListRequest.GetResponse())
        using (Stream resSteam = clientListResponse.GetResponseStream())
        {
            JsonValue jsonDoc = JsonObject.Load(resSteam);
            Console.WriteLine("Response: {0}", jsonDoc.ToString ());
        }          

示例Json:

{
    id: "26",
    owner: "7",
    owner_name: "Bradford Kolumbic",
    Status: "0",
    status_name: "None",
    Milestone: "0",
    milestone_name: "None",
    small_text_1: "Ghost Buster Solutions",
    small_text_8: "Business",
    small_text_7: "(858) 123-5432",
    small_text_2: "123 ABC Street",
    small_text_4: "Escondido",
    small_text_5: "California",
    small_text_6: "92027"
}

我創建了一個Client類,該類可用於存儲返回的JSON中的每個客戶端配置文件。

public class Client
{
    public string id { get; set; }
    public string owner { get; set; }
    public string owner_name { get; set; }
    public string Status { get; set; }
    public string status_name { get; set; }
    public string Milestone { get; set; }
    public string milestone_name { get; set; }
    public string small_text_1 { get; set; }
    public string small_text_8 { get; set; }
    public string small_text_7 { get; set; }
    public string small_text_2 { get; set; }
    public string small_text_4 { get; set; }
    public string small_text_5 { get; set; }
    public string small_text_6 { get; set; }
}

我嘗試了各種不同的方式,但似乎沒有一種適合我。 我確定我缺少了一些荒謬的顯而易見的東西。

我嘗試過的最后一件事是:

var JsonClientList = JsonConvert.DeserializeObject<List<Client>>(jsonDoc); 

盡管出現錯誤,但出現“無法將類型為'System.Json.JsonObject'的對象轉換為類型為'System.Json.JsonPrimitive'的錯誤”。

對於這個年輕的傻瓜的任何幫助將不勝感激。 感謝您的時間。

這對我有用

var json =@"
{
    id: ""26"",
    owner: ""7"",
    owner_name: ""Bradford Kolumbic"",
    Status: ""0"",
    status_name: ""None"",
    Milestone: ""0"",
    milestone_name: ""None"",
    small_text_1: ""Ghost Buster Solutions"",
    small_text_8: ""Business"",
    small_text_7: ""(858) 123-5432"",
    small_text_2: ""123 ABC Street"",
    small_text_4: ""Escondido"",
    small_text_5: ""California"",
    small_text_6: ""92027""
}";

var c = JsonConvert.DeserializeObject<Client>(json); 

如果您提供的示例是整個JSON對象,則它不是客戶端的集合( List<Client> ),而僅僅是一個Client

我建議您去這里: http : //json2csharp.com/並輸入您的JSON。 他們將立即為您創建C#類。

然后,我將NewtonSoft.Json nuget-package添加到我的項目中。 然后最后調用類似

JsonConvert.Deserialize<List<Client>>(jsonDoc);

這是我正在使用的代碼。 要執行HTTPRequest:

 public static string DoJsonRequest(string url, MemoryStream content)
        {

            byte[] dataByte = content.ToArray();

            //create http web request obj
            WebRequest postRequest = WebRequest.Create(url);
            //Method type
            postRequest.Method = "POST";
            // Data type - message body coming in xml
            postRequest.ContentType = "application/json; charset=utf-8";
            //Content length of message body
            postRequest.ContentLength = dataByte.Length;

            // Get the request stream
            using (Stream postStream = postRequest.GetRequestStream())
            {
                // Write the data bytes in the request stream
                postStream.Write(dataByte, 0, dataByte.Length);
                //Get response from server
                using (HttpWebResponse postResponse = (HttpWebResponse)postRequest.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(postResponse.GetResponseStream()))
                    {
                        return reader.ReadToEnd();
                    }
                }
            }
        }



        public static string GetJsonFromObject<TObject>(TObject obj, IEnumerable<Type> types)
        {
            using (var stream = new MemoryStream())
            {
                var jsSerializer = new DataContractJsonSerializer(typeof(TObject), types);

                jsSerializer.WriteObject(stream, obj);
                stream.Position = 0;

                using (StreamReader reader = new StreamReader(stream))
                {
                    string json = reader.ReadToEnd();
                    return json;
                }
            }
        }



public static TObject GetObjectFromJson<TObject>(string json, IEnumerable<Type> types)
{

    using (MemoryStream stream = new MemoryStream())
    {
        using (StreamWriter writer = new StreamWriter(stream))
        {
            writer.Write(json);
            writer.Flush();
            stream.Position = 0;

            var jsSerializer = new DataContractJsonSerializer(typeof(TObject), types);

            TObject obj = (TObject)jsSerializer.ReadObject(stream);

            return obj;
        }
    }
}

您可以看到我正在使用泛型。

對於,調用Method並向RESTFull服務發送請求。

 using (MemoryStream stream = new MemoryStream())
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.Write(json);
                        writer.Flush();
                        stream.Position = 0;

                        string response = HttpHelper.DoJsonRequest("https://localhost:44300/RestFull.svc/Execute", stream);

                        response = response.Remove(0, 1);
                        response = response.Remove(response.Length - 1, 1);
                        response = response.Replace("\\\"", "\"");
                        Data data = HttpHelper.GetObjectFromJson<Data>(response, Types);

                    }
                }

其中,Json = "\\"" + HttpHelper.GetJsonFromObject<Data>(request, Types).Replace("\\"", "\\\\\\"") + "\\"";

哦,如果您使用的是Vs 2013,另一種方法是在剪貼板上獲取JSON。 在VS中創建一個新文件,然后單擊“選擇性粘貼”。 of都准備好了。

標記

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM