反序列化 RESTSharp JSON 响应
Deserialize RESTSharp JSON Response
我正在开展一个从 NOAA 收集数据的项目。我无法弄清楚如何使响应可用。
这就是 NOAA API 对我的电话的回应:
{
"metadata": {
"resultset": {
"offset": 1,
"count": 38859,
"limit": 2
}
},
"results": [
{
"mindate": "1983-01-01",
"maxdate": "2019-12-24",
"name": "Abu Dhabi, AE",
"datacoverage": 1,
"id": "CITY:AE000001"
},
{
"mindate": "1944-03-01",
"maxdate": "2019-12-24",
"name": "Ajman, AE",
"datacoverage": 0.9991,
"id": "CITY:AE000002"
}
]
}
我用JSON2CSharp.com把结果集转成了我需要的类。下面是相关代码:
public class NOAA
{
public class Resultset
{
public int offset { get; set; }
public int count { get; set; }
public int limit { get; set; }
}
public class Metadata
{
public Resultset resultset { get; set; }
}
public class Location
{
public string mindate { get; set; }
public string maxdate { get; set; }
public string name { get; set; }
public double datacoverage { get; set; }
public string id { get; set; }
}
public class RootObject
{
public Metadata metadata { get; set; }
public List<Location> results { get; set; }
}
public class Response
{
IList<Metadata> metadata;
IList<Location> results;
}
public void RestFactory(string Token, string Endpoint, Dictionary<string, string> Params)
{
// Initiate the REST request
var client = new RestClient("https://www.ncdc.noaa.gov/cdo-web/api/v2/" + Endpoint);
var request = new RestRequest(Method.GET);
// Add the token
request.AddHeader("token", Token);
// Add the parameters
foreach (KeyValuePair<string, string> entry in Params)
{
request.AddParameter(entry.Key, entry.Value);
}
// Execute the REST request
var response = client.Execute(request);
// Deserialize the response
Response noaa = new JsonDeserializer().Deserialize<Response>(response);
// Print to console
foreach (Location loc in noaa)
{
Console.WriteLine(loc.name);
}
}
}
此时,我只是想打印位置名称以达到我的下一个学习里程碑。我收到错误:
Severity Code Description Project File Line Suppression State
Error CS1579 foreach statement cannot operate on variables of type 'NOAA.Response' because 'NOAA.Response' does not contain a public instance definition for 'GetEnumerator'
除了错误之外,我想我不太了解正确的方法,因为响应不止一个 "layer"。指导?
您的 foreach 循环试图在对象本身而不是其中的列表上调用迭代器。
试试这个
foreach (Location loc in noaa.results)
{
Console.WriteLine(loc.name);
}
我可以告诉你错误的原因。那是因为 noaa 是不可迭代的。如果你想遍历任何对象,那么它需要实现 IEnumerable 接口。这就是 noaa 不可迭代的原因。 noaa 不继承或实现此接口。如果您使用 noaa.results,您会得到同样的错误吗?
我正在开展一个从 NOAA 收集数据的项目。我无法弄清楚如何使响应可用。
这就是 NOAA API 对我的电话的回应:
{
"metadata": {
"resultset": {
"offset": 1,
"count": 38859,
"limit": 2
}
},
"results": [
{
"mindate": "1983-01-01",
"maxdate": "2019-12-24",
"name": "Abu Dhabi, AE",
"datacoverage": 1,
"id": "CITY:AE000001"
},
{
"mindate": "1944-03-01",
"maxdate": "2019-12-24",
"name": "Ajman, AE",
"datacoverage": 0.9991,
"id": "CITY:AE000002"
}
]
}
我用JSON2CSharp.com把结果集转成了我需要的类。下面是相关代码:
public class NOAA
{
public class Resultset
{
public int offset { get; set; }
public int count { get; set; }
public int limit { get; set; }
}
public class Metadata
{
public Resultset resultset { get; set; }
}
public class Location
{
public string mindate { get; set; }
public string maxdate { get; set; }
public string name { get; set; }
public double datacoverage { get; set; }
public string id { get; set; }
}
public class RootObject
{
public Metadata metadata { get; set; }
public List<Location> results { get; set; }
}
public class Response
{
IList<Metadata> metadata;
IList<Location> results;
}
public void RestFactory(string Token, string Endpoint, Dictionary<string, string> Params)
{
// Initiate the REST request
var client = new RestClient("https://www.ncdc.noaa.gov/cdo-web/api/v2/" + Endpoint);
var request = new RestRequest(Method.GET);
// Add the token
request.AddHeader("token", Token);
// Add the parameters
foreach (KeyValuePair<string, string> entry in Params)
{
request.AddParameter(entry.Key, entry.Value);
}
// Execute the REST request
var response = client.Execute(request);
// Deserialize the response
Response noaa = new JsonDeserializer().Deserialize<Response>(response);
// Print to console
foreach (Location loc in noaa)
{
Console.WriteLine(loc.name);
}
}
}
此时,我只是想打印位置名称以达到我的下一个学习里程碑。我收到错误:
Severity Code Description Project File Line Suppression State
Error CS1579 foreach statement cannot operate on variables of type 'NOAA.Response' because 'NOAA.Response' does not contain a public instance definition for 'GetEnumerator'
除了错误之外,我想我不太了解正确的方法,因为响应不止一个 "layer"。指导?
您的 foreach 循环试图在对象本身而不是其中的列表上调用迭代器。
试试这个
foreach (Location loc in noaa.results)
{
Console.WriteLine(loc.name);
}
我可以告诉你错误的原因。那是因为 noaa 是不可迭代的。如果你想遍历任何对象,那么它需要实现 IEnumerable 接口。这就是 noaa 不可迭代的原因。 noaa 不继承或实现此接口。如果您使用 noaa.results,您会得到同样的错误吗?