2011-08-20 35 views
2

我有一个Ajax调用(对于HighChartsDB图表)调用Web服务的WebForm应用程序,它使用WebRequest在另一个返回JsonResult的应用程序中调用MVC操作。反序列化JSON字符串从MVC行动到C#类

我设法将数据传回给Ajax调用,但我找回数据不会被解析为JSON对象,但只是一个字符串。

我的班:由highcharts称为

public class CategoryDataViewModel 
{ 
    public string name { get; set; } 
    public List<int> data { get; set; } 
    public double pointStart { get; set; } 
    public int pointInterval { get { return 86400000; } } 
} 

我AJAX功能:

function getBugs(mileId) { 
    var results; 

    $.ajax({ 
     type: 'GET', 
     url: 'Services/WebService.svc/GetData', 
     contentType: "application/json; charset=utf-8", 
     async: false, 
     data: { "mileId": parseInt(mileId) }, 
     dataType: "json", 
     success: function (data) { 
      console.log(data); 
      results = data; 
     } 
    }); 

    return results; 
} 

最后我的WebService

public class WebService : IWebService 
{ 
    public string GetData(int mileId) 
    { 
     string url = "http://localhost:63418/Home/GetWoWData?mileId=" + mileId; 
     WebRequest wr = WebRequest.Create(url); 

     using (var response= (HttpWebResponse)wr.GetResponse()) 
     { 
      using (var reader = new StreamReader(response.GetResponseStream())) 
      { 
       var objText = reader.ReadToEnd(); 
       return objText; 
      } 
     } 

    } 
} 

有了这个,当我CONSOLE.LOG(数据)在阿贾克斯电话我得到:

[{\"name\":\"Sedan\",\"data\":[30,30,30,30,35],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Low\",\"data\":[800,800,800,826,1694],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Medium\",\"data\":[180,180,180,186,317],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"High\",\"data\":[29,29,29,34,73],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Truck\",\"data\":[6,6,6,6,13],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"SUV\",\"data\":[-172,-172,-172,-179,-239],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Convertible\",\"data\":[0,0,0,0,-404],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Limo\",\"data\":[-7,-7,-7,-8,-214],\"pointStart\":1307836800000,\"pointInterval\":86400000}] 

我似乎无法设法返回到适当的Json对象。我试着在我的web服务与此将其转换回我CategoryDataViewModel:

var myojb = new CategoryDataViewModel(); 
    using (var response = (HttpWebResponse)wr.GetResponse()) 
    { 
     using (var reader = new StreamReader(response .GetResponseStream())) 
     { 
      JavaScriptSerializer js = new JavaScriptSerializer(); 
      var objText = reader.ReadToEnd(); 
      myojb = (CategoryDataViewModel)js.Deserialize(objText, typeof(CategoryDataViewModel)); 
     } 
    } 

    return myojb; 

但后来我得到Type 'Test.CategoryDataViewModel' is not supported for deserialization of an array.

回答

1

变化:

myojb = (CategoryDataViewModel)js.Deserialize(objText, typeof(CategoryDataViewModel)); 

到:

myojb = (List<CategoryDataViewModel>)js.Deserialize(objText, typeof(List<CategoryDataViewModel>)); 

和你应该没事。该阵列将反序列化为列表没有问题。

+0

myojb需要重新定义为List 。 –

+0

该死的我实际上已经尝试过了,但是我遗漏了ajax部分的一个'result = JSON.stringyfy(data)'错误......谢谢! :) – LanFeusT

1

我以前见过类似的事情,我想你可能需要改变MyObj中的列表。

List<CategoryDataViewModel> myObjs = new List<CategoryDataViewModel>(); 
... 
myObjs = js.Deserialize<List<CategoryDataViewModel>>(objText); 
+0

Joey道歉,他先到那里,但由于某种原因,它没有提醒我任何答案。 –