繁体   English   中英

如何使用.NET解析此第三方JSON服务?

[英]How to parse this 3rd party JSON service using .NET?

我正在尝试通过.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>>生成。 您可以将其更改为包含intDateTime对象的类,但是必须手动将JSON中的int转换为DateTime对象。

在webrequest端,您可以将HttpClient与.NET 4.5中的新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点,则可以在Json.NET api中使用JObject.Parse

var jobject = JObject.Parse(json);

// Extract data points only
var dataPoints = jobject["project"]["data"];

您正在尝试反序列化为完全与响应json不匹配的模型! 您必须创建模型以匹配响应,对于初学者而言,您的模型类应命名为Request,而Data模型应是Request模型的成员,并且类型应是您现在尝试使用的模型类型的List of List。 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM