查询 WebAPI - webapi 无法反序列化当前 JSON 数组

Querying WebAPI - webapi Cannot deserialize the current JSON array

我使用 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 returns 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 class 只是您在上面看到的每个字段的声明。

webapi 提供了选择日期范围的方法,因此我可以将许多 TagDetails 作为列表返回,但它也可以 return 只有一个(我可以通过稍微更改我的代码来实现这一点)。我需要它为一个或多个结果工作。

正如评论所解释的那样,您需要 return List<TagDetail> 作为 GetTagDetailAsync。然后您可以使用 foreach 来循环 result.This 将为一个或多个 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;
    }