1

RestSharpを使用して、単純なWindowsPhone7アプリケーションのCambridgeDictionariesAPIからいくつかのデータを取得しています。検索クエリを実行すると、応答を確認するため、JSONで結果が得られます。コンテンツと結果は実際に返されますが、結果を逆シリアル化してリストボックス要素にバインドしようとすると機能しません。コードは次のとおりです。

リクエストハンドラクラス

namespace RestAPI
{
/// <summary>
/// This class is responsible for communicating with a RESTful web service.
/// </summary>
public class RequestHandler
{
    //this property stores the API key
    readonly string Accesskey = "";

    //this property stores the base URL
    readonly string BaseUrl =  "https://dictionary.cambridge.org/api/v1/dictionaries/british/search";
    //readonly string BaseUrl = "https://dictionary.cambridge.org/api/v1/dictionaries";

    //Instance of the RestClient
    private RestClient client;



    //Constructor that will set the apikey 
    public RequestHandler(string Access="Doh52CF9dR8oGOlJaTaJFqa05PysEKIbEvd9VNQ7CqB81MyTUCggGNQO7PDyrsyY")
    {
        this.Accesskey = Access.Trim();
        client = new RestClient(this.BaseUrl);
    }

    //Execute function

    public List<SearchResult> Execute(string word)
    {
        List<SearchResult> data = new List<SearchResult>();
        RestRequest request = new RestRequest();
        request.RequestFormat = DataFormat.Json;
        request.AddHeader("accessKey",Accesskey);
        request.AddParameter("pageIndex","1");
        request.AddParameter("pageSize","5");
        request.AddParameter("q",word.Trim());


        client.ExecuteAsync<List<SearchResult>>(request,(response)=>{


            try
            {
            var resource = response.Data;

            if(response.ResponseStatus == ResponseStatus.Completed)
                MessageBox.Show(resource.Count.ToString());


            //MessageBox.Show(resource.ToString());

            foreach(SearchResult s in resource)
            {
                data.Add(s);
               }
            }
        catch(Exception e)
        {
            MessageBox.Show(e.Message);
        }


    });

        return data;    
      }
}
}

メインページのファイルの背後にあるコード。

namespace RestAPI
{
public partial class MainPage : PhoneApplicationPage
{
    public RequestHandler handler = new RequestHandler();
    public List<SearchResult> info = new List<SearchResult>();

    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }

    private void search_Click(object sender, RoutedEventArgs e)
    {
        info = handler.Execute(searchBox.Text);
        listBox1.Items.Add("Testing");
        foreach (SearchResult s in info)
        {
            listBox1.Items.Add(s.entryLabel);

        }
    }
}
 }

データが逆シリアル化されるモデルクラス。

namespace RestAPI
{
public class SearchResult
{

    public string entryLabel{get;set;}
    public string entryUrl{get;set;}
    public string entryId { get; set; }

}

}

返されるサンプルJSONデータ。

{
"resultNumber": 49,
"results": [
    {
        "entryLabel": "dog noun  ANIMAL ",
        "entryUrl": "http://dictionary.cambridge.org/dictionary/british/dog_1",
        "entryId": "dog_1"
    },
    {
        "entryLabel": "dog noun  PERSON ",
        "entryUrl": "http://dictionary.cambridge.org/dictionary/british/dog_2",
        "entryId": "dog_2"
    },
    {
        "entryLabel": "dog verb  FOLLOW ",
        "entryUrl": "http://dictionary.cambridge.org/dictionary/british/dog_3",
        "entryId": "dog_3"
    }
],
"dictionaryCode": "british",
"currentPageIndex": 1,
"pageNumber": 17
}
4

1 に答える 1

1

このような何かがトリックを行う必要があります:

public class SearchResultResponse
{
    public int ResultsNumber { get; set; }
    public IEnumerable<SearchResult> Results { get; set; }
}

public class SearchResult
{

    public string entryLabel { get; set; }
    public string entryUrl { get; set; }
    public string entryId { get; set; }
}

SearchResultResponse obj = JsonConvert.DeserializeObject<SearchResultResponse>(json);

あなたの場合、あなたはclient.ExecuteAsyncこのように呼ぶ必要があるかもしれません:

client.ExecuteAsync<SearchResultResponse>
于 2012-10-11T08:56:22.623 に答える