2012-07-26 29 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; } 
} 

问候