2012-07-26 50 views
2

我不知道如何描述這一點,但我會盡我所能。我有一個C#應用程序,它接受我的Web應用程序的API,並將它的JSON響應用作應用程序的數據。當用戶點擊一個按鈕,然後它從URL中提取響應並解析它以便使用它:C#類具有多個返回字符串和int

 var client = new WebClient(); 
     client.Headers.Add("User-Agent", "Nobody"); 
     var response = client.DownloadString(new Uri("http://localhost:45035/api/products/1")); 
     var responsestring = response.ToString(); 
     JObject o = JObject.Parse(responsestring); 

     Int32 Id = (int)o["Id"]; 
     string Name = (string)o["Name"]; 
     string Category = (string)o["Category"]; 
     float Price = (float)o["Price"]; 
     string Website = (string)o["Website"]; 

     label1.Text = Name; 
     label2.Text = "$" + Price.ToString(); 
     label3.Text = "Category: " + Category; 
     label4.Text = Id.ToString(); 

這很好。問題是,當我有成千上萬的產品時,這個應用程序將有上千個代碼塊,就像這樣,只有DownloadString Uri發生了變化。我想把它變成一個類,這樣我就可以插入適當的Uri(例如,http://example.com:45035/api/products/1http://example.com:45035/api/products/2等),並從中獲取名稱,類別,ID等,這樣我的代碼就會更清晰,但是我無法弄清楚如何做到這一點。

我想是這樣的:

 public static object responseinfo(string url) 
    { 
     var client = new WebClient(); 
     client.Headers.Add("User-Agent", "Nobody"); 
     var response = client.DownloadString(new Uri(url)); 
     var responsestring = response.ToString(); 
     JObject o = JObject.Parse(responsestring); 

     Int32 Id = (int)o["Id"]; 
     string Name = (string)o["Name"]; 
     string Category = (string)o["Category"]; 
     float Price = (float)o["Price"]; 
     string Website = (string)o["Website"]; 
    } 

,讓我打電話:jsonfind( 「HTTP://本地主機:45035/API /產品/ 1」),但我不知道怎麼弄的串出來,所以我可以像我以前那樣在文本框中使用它們。

我希望這種做法自那以後。這是我的第一個問題,所以如果我需要改變一些,或者很多,請告訴我。

爲了記錄我正在使用Json.NET處理JSON響應。

感謝,

米切爾

+0

你好:坦率地說,我不明白:(問:您最初的代碼塊,'VAR的客戶=新的Web客戶端(); .. Q:如果是這樣的話,爲什麼不直接創建該類的名稱,類別,價格和網站成員? – paulsm4 2012-07-26 04:52:15

+0

該代碼適用於按鈕:Button1_Click。按鈕被點擊,第一個代碼塊被執行 – 2012-07-26 05:06:43

+0

行 - 那麼爲什麼不讓Name和其他類的成員? – paulsm4 2012-07-26 05:56:31

回答

4

最直接的方法,以你的問題是使用out parameters

public void GetTwoNumers(out int num1, out int num2) { 
    num1 = 4; 
    num2 = 2; 
} 

更好的解決辦法是拉WebClient碼出成單獨功能返回JObject

public static JObject WebRequest(string url) { 
    var client = new WebClient(); 
    client.Headers.Add("User-Agent", "Nobody"); 
    var response = client.DownloadString(new Uri(url)); 
    var responsestring = response.ToString(); 
    return JObject.Parse(responsestring); 
} 

然後,使用該功能在其他一些API調用函數,都返回自己的階級與相關領域:

public class Item { 
    public int Id { get; private set; } 
    public string Name { get; private set; } 
    public string Category { get; private set; } 
    public float Price { get; private set; } 
    public string Website { get; private set; } 

    private Item() { 
    } 

    public static Item GetFromUrl(string url) { 
     var o = WebRequest(url); 

     return new Item() { 
      Id = (int)o["Id"], 
      Name = (string)o["Name"], 
      Category = (string)o["Category"], 
      Price = (float)o["Price"], 
      Website = (string)o["Website"], 
     }; 
    } 
} 

,然後調用此代碼:

private void button1_Click(object sender, EventArgs e) { 
    string url = "..."; 
    var item = Item.GetFromUrl(url); 

    MessageBox.Show("You found item #" + item.Id + " named " + item.Name); 

    txtBoxName.Text = item.Name; 
    txtBoxCat.Text = item.Category; 
} 

注意我這裏使用了靜態工廠方法GetFromUrl,並使構造函數爲私有。所以你只能通過這個靜態方法得到一個實例。不是完全必要的,而是一個很好的技術,IMO。

+0

我想我明白你在說什麼了,你可以舉一個簡短的例子你會分開的功能? – 2012-07-26 04:53:11

+0

不好意思問這麼多問題,但我很難理解我應該如何使用它。也許這是因爲我很沮喪:(說用戶點擊一個按鈕:Button1_Click。按鈕會告訴類在哪裏導航,然後我需要它返回ID,名稱等,所以我可以把它放入一個文本框(例如。textbox1.text = Name,textbox2.text = Category)這樣做,我只是看不到它?謝謝你的幫助! – 2012-07-26 05:11:59

+0

增加了一個調用我們剛剛寫的'Item.GetFromUrl'的例子。 – 2012-07-26 05:19:34

1

我能想到的幾個選項:

1)創建您自己的類型,並將其返回:

class JObjectReturned { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; } 
    public float Price { get; set; } 
    public string Website { get; set; } 
} 

public static JObjectReturned responseinfo(string url) 
{ 
    var client = new WebClient(); 
    client.Headers.Add("User-Agent", "Nobody"); 
    var response = client.DownloadString(new Uri(url)); 
    var responsestring = response.ToString(); 
    JObject o = JObject.Parse(responsestring); 

    return new JObjectReturned() { 
     Id = (int)o["Id"], 
     Name = (string)o["Name"], 
     Category = (string)o["Category"], 
     Price = (float)o["Price"], 
     Website = (string)o["Website"] 
    }; 
} 

然後你可以使用它像這樣:

for (int i = 0; i < urls.Length; i++) { 
    JObjectReturned obj = responseInfo(urls[i]); 
    // obj.Name, obj.Price, etc.. 
} 

2)返回JObject。

..只是不返回一個元組。

+0

3:返回元組;) – TomTom 2012-07-26 04:56:02

0

你有沒有想過使用一個類,讓產品,存儲和檢索值?

puclic class Product 
{ 
    int ID; 
    string Name; 
    string Category; 
    string Website; 
    float Price; 
} 

如果您真的想要,您甚至可以使用DataTable

0

也許是這樣的:

public class ProductDTO 
{ 
    public ProductDTO(string SourceURI) 
    { 
     this.SourceURI = SourceURI; 
    } 

    public void GetReady() 
    { 
     var client = new WebClient(); 
     client.Headers.Add("User-Agent", "Nobody"); 
     var response = client.DownloadString(new Uri(this.SourceURI)); 
     var responsestring = response.ToString(); 
     JObject o = JObject.Parse(responsestring); 

     this.Id = (int)o["Id"]; 
     this.Name = (string)o["Name"]; 
     this.Category = (string)o["Category"]; 
     this.Price = (float)o["Price"]; 
     this.Website = (string)o["Website"]; 
    } 

    public int Id { get; private set; } 
    public string Name { get; private set; } 
    public string Category { get; private set; } 
    public float Price { get; private set; } 
    public string Website { get; private set; } 
    public string SourceURI { get; private set; } 
} 

問候