2

これをどう表現していいのかわかりませんが、できる限りのことをするつもりです。Web アプリの API を取得し、その JSON 応答をアプリのデータとして使用する C# アプリがあります。ユーザーがボタンをクリックすると、URL から応答が取得され、解析されて使用できるようになります。

        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 だけが変更された、このように何千ものコード ブロックが含まれることです。これを 1 つのクラスに変換して、適切な Uri (例: http://example.com:45035/api/products/1またはhttp://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://localhost:45035/api/products/1") を呼び出すことができますが、文字列を取得する方法がわからないため、以前と同じようにテキスト ボックスで使用できます。

以来、このような形になることを願っています。これは私の最初の質問なので、変更する必要がある場合は教えてください。

私が Json.NET を使用している記録については、JSON 応答を処理します。

ありがとう、

ミッチェル

4

4 に答える 4

4

あなたの質問への最も直接的なアプローチは、outパラメータを使用することです:

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、コンストラクタを非公開にしたことに注意してください。したがって、その静的メソッドを介してのみインスタンスを取得できます。完全に必要というわけではありませんが、ここでは良いテクニックです。

于 2012-07-26T04:48:32.143 に答える
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 を返します。

.. タプルを返さないでください。

于 2012-07-26T04:51:47.470 に答える
0

クラスを使用して値を保存および取得することを考えたことがありますか?

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

本当に必要な場合は、 DataTableを使用することもできます。

于 2012-07-26T04:51:53.363 に答える
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; }
}

よろしく

于 2012-07-26T04:54:25.263 に答える