[英]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.