首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与NOAA API集成

与NOAA API集成
EN

Stack Overflow用户
提问于 2018-01-17 17:03:50
回答 1查看 1.3K关注 0票数 2

我正在学习如何集成NOAA API ( https://www.ncdc.noaa.gov/cdo-web/webservices/v2#gettingStarted)。

通过使用与这里概述的方法类似的方法:https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient

反序列化与特定位置关联的天气数据

我有一个Result.cs对象

代码语言:javascript
复制
public class Result
{
    public DateTime Date { get; set; }
    public string DataType { get; set; }
    public string Station { get; set; }
    public string Attributes { get; set; }
    public int Value { get; set; }
}

我尝试序列化并写入控制台以进行测试:

代码语言:javascript
复制
private static async Task ProcessRespositories()
{
    var serializer = new DataContractJsonSerializer(typeof(List<Result>));
    //token set from https://www.ncdc.noaa.gov/cdo-web/token
    string token = "myToken";
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Add("token", token);
    //url taken from https://www.ncdc.noaa.gov/cdo-web/webservices/v2#data for daily summaries
    string url = "https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&locationid=ZIP:28801&startdate=2010-05-01&enddate=2010-05-01"
    //this is null
    var streamTask = client.GetStreamAsync(url);
    var repositories = serializer.ReadObject(await streamTask) as List<Result>;

    foreach (var repo in repositories)
        Console.WriteLine(repo.Value);
}

我从那个网址得到的结果似乎是空的。我只是在学习,但不确定我的错误在这里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-17 17:41:59

从响应中获得的有效载荷如下所示:

{“元数据”:{“结果集”:{“偏移”:1、“计数”:8、“限制”:25}、“结果”:{“日期”:“2010-05-01T00:00:00”、“数据类型”:“PRCP”、“站点”:“GHCND:US1NCBC0005”、“属性”:“、N、”、“值”:0}、{“日期”:“2010-05-01T00:00:00”、“数据类型”:“斯诺”、“站”:“GHCND:US1NCBC0005 ","attributes":",,N,”,“value”:0}

您给出的DataContractSerializer类型需要匹配该有效负载。你错过了一个集装箱。此外,字段的名称区分大小写。我使用一个DataMember属性来调整正确的大小写。最后但并非最不重要的一点是,默认情况下不支持日期时间格式。现在,我将其更改为字符串类型。您可能想看看https://stackoverflow.com/a/9347678/578411是否可以为您工作,还是切换到Json.NET

下面是模型类

代码语言:javascript
复制
public class Noaa
{
    public MetaData metadata {get;set;}
    public List<Result> results;
}

public class MetaData 
{
    public ResultSet resultset {get;set;}
}

public class ResultSet
{
   public int offset{get;set;}
   public int count{get;set;}
   public int limit{get;set;}
}

[DataContract]
public class Result
{
    [DataMember(Name="date")]
    public string Date { get; set; } // now a string!
    [DataMember(Name="datatype")]
    public string DataType { get; set; }
    [DataMember(Name="station")]
    public string Station { get; set; }
    [DataMember(Name="attributes")]
    public string Attributes { get; set; }
    [DataMember(Name="value")]
    public int Value { get; set; }
}

而且您的序列化程序需要更改以使用容器类型:

代码语言:javascript
复制
var serializer = new DataContractJsonSerializer(typeof(Noaa));

// other code the same

// call the serializer
var repositories = (Noaa) serializer.ReadObject(await streamTask);

// respositories is now a Noaa type, 
// its member results holds your list.
foreach (var repo in repositories.results)
            Console.WriteLine(repo.Value);

如果要检查有效负载而不是将其传递给序列化程序,则可以使用如下所示的StreamReader:

代码语言:javascript
复制
var sw= new StreamReader(await streamTask);
Console.WriteLine(sw.ReadToEnd());

使用Chrome插件邮递员或使用网络代理(如费德勒 )

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48306396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档