c# - 查询 WebAPI - webapi 无法反序列化当前 JSON 数组
问题描述
我已经使用 MVC 构建了一个 Web API,它按预期工作。
我现在正在尝试从控制台应用程序查询 API,但遇到了问题。我明白为什么我会遇到这个问题,但我不明白如何解决它。
我来自控制台应用程序的代码:
static HttpClient client = new HttpClient();
static void Main(string[] args)
{
RunAsync().GetAwaiter().GetResult();
}
static async Task RunAsync()
{
client.BaseAddress = new Uri(URL);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
List<TagDetail> tagDetail = new List<TagDetail>();
tagDetail = await GetTagDetailAsync("api/tagdetail/?tagname=myTag&startdate=010120190000&enddate=020120190000");
Console.WriteLine(tagDetail.value);
}
static async Task<TagDetail> GetTagDetailAsync(string path)
{
List<TagDetail> tagdetail = new List<TagDetail>();
HttpResponseMessage response = await client.GetAsync(path);
var test = response.StatusCode;
var test2 = response.Headers;
if (response.IsSuccessStatusCode)
{
tagdetail = await response.Content.ReadAsAsync<List<TagDetail>>(
new List<MediaTypeFormatter>
{
new XmlMediaTypeFormatter(),
new JsonMediaTypeFormatter()
});
}
return tagdetail;
}
我得到的错误是:
tagDetail = await GetTagDetailAsync("api/tagdetail/?tagname=99TOTMW&startdate=010120190000&enddate=020120190000");
和
return tagdetail;
Web API 以 JSON 格式返回数据,如下所示:
{
"tagname":"myTag",
"value":"99.99",
"description":"myDescription",
"units":"£",
"quality":"Good",
"timestamp":"2019-08-01T17:32:30"
},
{
"tagname":"myTag",
"value":"22.22",
"description":"myDescription",
"units":"£",
"quality":"Good",
"timestamp":"2019-08-01T17:33:30"
}
TagDetail 类只是您在上面看到的每个字段的声明。
webapi 提供了选择日期范围的方法,因此我可以将许多 TagDetails 作为列表返回,但它也可以只返回一个(我可以通过稍微更改我的代码来使其工作)。我需要它为一个结果或多个结果工作。
解决方案
正如评论所解释的,您需要返回List<TagDetail>
您的GetTagDetailAsync
. 然后您可以使用foreach
循环结果。这将适用于一个或多个 TagDetail
static async Task RunAsync()
{
//other logic
List<TagDetail> tagDetail = new List<TagDetail>();
tagDetail = await GetTagDetailAsync("api/tagdetail/?tagname=myTag&startdate=010120190000&enddate=020120190000");
foreach(var item in tagDetail)
{
Console.WriteLine(item.value);
}
}
static async Task<List<TagDetail>> GetTagDetailAsync(string path)
{
List<TagDetail> tagdetail = new List<TagDetail>();
HttpResponseMessage response = await client.GetAsync(path);
var test = response.StatusCode;
var test2 = response.Headers;
if (response.IsSuccessStatusCode)
{
tagdetail = await response.Content.ReadAsAsync<List<TagDetail>>(
new List<MediaTypeFormatter>
{
new XmlMediaTypeFormatter(),
new JsonMediaTypeFormatter()
});
}
return tagdetail;
}
推荐阅读
- python - 如何设置scrapy蜘蛛ReturnsContract的上限
- javascript - HighCharts yAxis 大数字周围空间太大
- java - 连接到 MQTT 代理
- gpu - google-colaboratory GPU 上的 Pytorch - 非法内存访问
- shell - 用于运行多个 Make 命令的脚本
- google-chrome - 如何将 VSCode 调试器附加到 Brave 浏览器?
- haskell - 在 Haskell 中创建新数据类型时出现问题
- botframework - 无法删除 O365 机器人
- angular - 角休息服务数据变化反映
- php - 将(非标准)json解析为数组/对象