我正在尝试通过.NET桌面应用程序阅读Web服务api。我已经尝试了以下方法,但是没有任何内容。通过Fiddler,如果我单击[Raw]选项卡,则响应如下所示:
HTTP/1.1 200 OK
Date: Fri, 01 Aug 2014 21:49:48 GMT
Server: Apache
X-Powered-By: PHP/5.3.3
Connection: close
Content-Length: 125478
Access-Control-Allow-Origin: *
Content-Type: application/json
Content-Language: en
{"request":{"command":"project","project_id":"XYZ123"},"project":[{"project_id":"XYZ123","name":"Project Financials","description":"Sales","state":"CA","dept":"Finance","modified":"2014-08-01","data":[["20140801", 112423],["20140731", 689944],["20140730", 9855], ["20140729", 13118], ["20140728", 9448],
... more data ...
["20140318", 1546], ["20140317", 5467], ["20140316", 19578], ["20140315", 90158]]}]}
我想捕获数据点,即上述JSON段中的“数据”。为此,我有一个简单的类,如下所示:
public class DailySales
{
public datetime Date { get; set; }
public int UnitsSold { get; set; }
}
这是我的网络服务代码:
private void GetSales()
{
var webClient = new WebClient();
webClient.OpenReadCompleted += webClient_OpenReadCompleted;
webClient.OpenReadAsync(new Uri("http://3rdPartySite.com));
}
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
var json = new DataContractJsonSerializer(typeof(List<DailySales>));
var data = (List<DailySales>)json.ReadObject(e.Result); // returns null
}
我所缺少的任何提示将不胜感激。
好吧,您的json不会反序列化,因为您的类模型根本不匹配它。
首先,创建一个合适的模型(这是使用json2csharp生成的):
public class Request
{
public string command { get; set; }
public string project_id { get; set; }
}
public class Project
{
public string project_id { get; set; }
public string name { get; set; }
public string description { get; set; }
public string state { get; set; }
public string dept { get; set; }
public string modified { get; set; }
public List<List<object>> data { get; set; }
}
public class RootObject
{
public Request request { get; set; }
public List<Project> project { get; set; }
}
data
由于List<List<object>>
无法识别普通模式,因此便笺以的形式生成。您可以将其更改为包含int
和DateTime
对象的类,但必须将JSON中的intDateTime
手动转换为对象。
在webrequest端,您可以将.NET 4.5中HttpClient
的新async-await
功能与以下功能一起使用Json.NET
:
public async Task RequestAndDeserializeJson()
{
var httpClient = new HttpClient();
var json = await httpClient.GetAsStringAsync("http://3rdPartySite.com");
RootObject obj = JsonConvert.Deserialize<RootObject>(json);
}
如果只想提取data
点,则可以JObject.Parse
在Json.NET api中使用:
var jobject = JObject.Parse(json);
// Extract data points only
var dataPoints = jobject["project"]["data"];
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句