Asp.net mvc 3 使用restsharp将Json反序列化为类对象

Asp.net mvc 3 使用restsharp将Json反序列化为类对象,asp.net-mvc-3,restsharp,Asp.net Mvc 3,Restsharp,我已经查阅了restsharp的文档,并在Google上搜索了解决方案,但无法找到解决此问题的方法: 我有一个asp.net mvc3应用程序,需要连接到quizlet.com以访问公共闪存卡。我添加了对restsharp的引用,并创建了以下类: public class QuizletObject { public string response_type { get; set; } public int total_results { get; set; } publ

我已经查阅了restsharp的文档,并在Google上搜索了解决方案,但无法找到解决此问题的方法:

我有一个asp.net mvc3应用程序,需要连接到quizlet.com以访问公共闪存卡。我添加了对restsharp的引用,并创建了以下类:

public class QuizletObject
{
    public string response_type { get; set; }
    public int total_results { get; set; }
    public int page { get; set; }
    public int total_pages { get; set; }
    public int sets_with_images { get; set; }
    public Set[] sets { get; set; }
}

public class Set
{
    public int id { get; set; }
    public string title { get; set; }
    public string url { get; set; }
    public string creator { get; set; }
    public int created { get; set; }
    public int term_count { get; set; }
    public bool has_images { get; set; }
    public int last_modified { get; set; }
}
我有一个调用web服务的类和方法,如下所示:

public class Quizlet
{
    private string _baseUrl = "http://api.quizlet.com/1.0/sets";
    private const string DevKey = "my dev key";               

    public QuizletObject GetQuizletSets()
    {
        _baseUrl = _baseUrl + "?dev_key=" + DevKey + "&q=" + "geography";

        RestClient client = new RestClient();
        client.BaseUrl = _baseUrl;

        RestRequest request = new RestRequest(Method.GET);
        request.RequestFormat = DataFormat.Json;

        RestResponse<QuizletObject> response = client.Execute<QuizletObject>(request);

        return response.Data;
    }
}
private string _baseUrl = "http://api.quizlet.com/1.0";
...
request.Resource = "sets?dev_key=" + DevKey + "&q=" + "geography";
堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Users\Girish\Documents\Visual Studio 2010\Projects\RestSharpPoC\RestSharpPoC\Views\Home\Index.cshtml:18
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +207
System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +81
System.Web.WebPages.StartPage.RunPage() +19
System.Web.WebPages.StartPage.ExecutePageHierarchy() +65
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +220
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +303
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
System.Web.Mvc.Controller.ExecuteCore() +116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963149
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
[NullReferenceException:对象引用未设置为对象的实例。]
ASP.\u Page\u Views\u Home\u Index\u cshtml.Execute()中的c:\Users\Girish\Documents\Visual Studio 2010\Projects\RestSharpPoC\RestSharpPoC\Views\Home\Index.cshtml:18
System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+207
System.Web.Mvc.WebViewPage.ExecutePageHierarchy()+81
System.Web.WebPages.StartPage.RunPage()+19
System.Web.WebPages.StartPage.ExecutePageHierarchy()+65
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext-pageContext、TextWriter-writer、WebPageRenderingBase-startPage)+76
System.Web.Mvc.RazorView.RenderView(ViewContext、TextWriter、Object实例)+220
System.Web.Mvc.buildmanager compiledview.Render(ViewContext、TextWriter)+115
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext上下文)+303
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext ControllerContext,ActionResult ActionResult)+13
System.Web.Mvc.c__显示Class1C.b__19()+23
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter筛选器,ResultExecutingContext预文本,Func`1 continuation)+260
System.Web.Mvc.c__DisplayClass1e.b__1b()+19
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext ControllerContext,IList`1过滤器,ActionResult ActionResult)+177
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)+343
System.Web.Mvc.Controller.ExecuteCore()+116
System.Web.Mvc.ControllerBase.Execute(RequestContext-RequestContext)+97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext RequestContext)+10
System.Web.Mvc.c__显示类b.b__5()+37
System.Web.Mvc.Async.c__显示类1.b__0()+21
System.Web.Mvc.Async.c_uuudisplayClass8`1.b_uuu7(IAsyncResult)+12
System.Web.Mvc.Async.WrappedAsyncResult`1.End()+62
System.Web.Mvc.c_uuudisplayClasse.b_uuud()+50
System.Web.Mvc.SecurityUtil.b___0(操作f)+7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(操作)+22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+60
System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.EndProcessRequest(IAsyncResult结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8963149
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+184

我也看到过同样的问题。我还没有在RestSharp中找到它,但是我要做的是将json文本返回,然后自己反序列化它

对于您的代码,可能类似于以下内容:

response = client.Execute(request);
var quizletObject = Newtonsoft.Json.JsonConvert.DeserializeObject<QuizletObject>(response.Content);
如果除了“设置”之外还有多个可用的呼叫,我可能会这样设置:

public class Quizlet
{
    private string _baseUrl = "http://api.quizlet.com/1.0/sets";
    private const string DevKey = "my dev key";               

    public QuizletObject GetQuizletSets()
    {
        _baseUrl = _baseUrl + "?dev_key=" + DevKey + "&q=" + "geography";

        RestClient client = new RestClient();
        client.BaseUrl = _baseUrl;

        RestRequest request = new RestRequest(Method.GET);
        request.RequestFormat = DataFormat.Json;

        RestResponse<QuizletObject> response = client.Execute<QuizletObject>(request);

        return response.Data;
    }
}
private string _baseUrl = "http://api.quizlet.com/1.0";
...
request.Resource = "sets?dev_key=" + DevKey + "&q=" + "geography";

编辑:只是想到了一些其他的东西-尝试使用列表而不是Set[],也许RestSharp会更容易处理这个问题。

我也看到了同样的问题。我还没有在RestSharp中找到它,但是我要做的是将json文本返回,然后自己反序列化它

对于您的代码,可能类似于以下内容:

response = client.Execute(request);
var quizletObject = Newtonsoft.Json.JsonConvert.DeserializeObject<QuizletObject>(response.Content);
如果除了“设置”之外还有多个可用的呼叫,我可能会这样设置:

public class Quizlet
{
    private string _baseUrl = "http://api.quizlet.com/1.0/sets";
    private const string DevKey = "my dev key";               

    public QuizletObject GetQuizletSets()
    {
        _baseUrl = _baseUrl + "?dev_key=" + DevKey + "&q=" + "geography";

        RestClient client = new RestClient();
        client.BaseUrl = _baseUrl;

        RestRequest request = new RestRequest(Method.GET);
        request.RequestFormat = DataFormat.Json;

        RestResponse<QuizletObject> response = client.Execute<QuizletObject>(request);

        return response.Data;
    }
}
private string _baseUrl = "http://api.quizlet.com/1.0";
...
request.Resource = "sets?dev_key=" + DevKey + "&q=" + "geography";
编辑:只是想到了一些其他的东西-尝试使用列表而不是Set[],也许RestSharp会更容易使用它