httpClient.GetAsync电话扔System.ArgumentException:无法确定JSON对象类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpClient.GetAsync电话扔System.ArgumentException:无法确定JSON对象类型相关的知识,希望对你有一定的参考价值。

我尝试调用由httpClient.GetAsync一个获取API。但我得到异常

“System.ArgumentException:无法确定类型System.Threading.Tasks.Task1[Newtonsoft.Json.Linq.JObject]. at Newtonsoft.Json.Linq.JValue.GetValueType(Nullable1电流,对象的值)JSON对象类型 r n在Newtonsoft.Json.Linq.JContainer.CreateFromContent(对象内容) r n在Newtonsoft。 Json.Linq.JContainer.AddInternal(的Int32索引,对象内容,布尔skipParentCheck个) r n在MediaIngestionSFSvc.Controllers.MediaIngestionController.d__2.MoveNext()”

下面是我尝试调用API

public IActionResult GetSKUByEditionDisplayName(string edition)
    {
        string message = null;
        try
        {
            if (string.IsNullOrEmpty(edition))
            {
                message = $"Edition is null";
                throw new ArgumentNullException(message);
            }

            SqlQuerySpec sqlQuery = repository.GenerateQuery(CollectionName, new KeyValuePair<string, object>(Enums.id.ToString(), MediaRefreshConstants.SKUtoEditionTable));
            IEnumerable<JObject> docs = repository.ReadItemAsync<JObject>(sqlQuery);

            if (!docs.Any())
            {
                message = $"No SKUtoEditionTable found in Cosmos db";
                throw new NullReferenceException(message);
            }

            string responseBody = JsonConvert.SerializeObject(docs);
            string jsonObject = responseBody.Trim().Trim('[', ']');
            JObject responseObject = JObject.Parse(jsonObject);

            if (responseObject[edition] == null)
            {
                message = $"No Edition {edition} found in SKUtoEditionTable";
                throw new NullReferenceException();
            }

            string sku = responseObject[edition].ToString();
            return CreateActionResult(HttpStatusCode.OK, sku);

        } catch (Exception e) when (e is ArgumentNullException || e is NullReferenceException)
        {
            message = $"Fail to retrieve sku from EditionToSKUTypeMapping table";
            return CreateActionResult(HttpStatusCode.BadRequest, e.ToString());
        } catch (Exception ex)
        {
            message = $"Fail to retrieve sku from EditionToSKUTypeMapping table";
            return CreateActionResult(HttpStatusCode.InternalServerError, ex.ToString());
        }
    }   

不知道发生什么事,有人可以给我一些帮助吗?

答案

您收到的即时错误是因为你不awaitrepository.ReadItemAsync<JObject>电话。因此,返回类型Task<JObject>,不JObject

更改

IEnumerable<JObject> docs = repository.ReadItemAsync<JObject>(sqlQuery);

IEnumerable<JObject> docs = await repository.ReadItemAsync<JObject>(sqlQuery);

话虽这么说,也有一些可能会导致问题的其他事情。如果你是一个序列化数组对象,然后修剪掉[],它不再是有效的JSON,如果有原始数组中多个元素。此外,序列化对象以JSON立即反序列化是一个有点古怪,可能值得重新思考。

另一答案

我通过这种方式解决此问题:这是原来的逻辑:公共异步任务A(URI字符串,字符串的contentType){HttpResponseMessage httpResponseMessage =等待httpClient.GetAsync(URI);返回httpResponseMessage; }

   private async Task<string> B(string edition)
    {

        HttpResponseMessage keyValueResponse = await new HttpHelper().A(keyPairUrl, JsonContentTypeHeaderValue);
        string responseBody = await keyValueResponse.Content.ReadAsStringAsync();
        return responseBody.Trim();
    }

  private async<JObject> C() {
   JObject object = new JObject();
object["s"] = await B(some string);
return object;
}

它会抛出异常上面:但是,如果我改变的await B(somestring);到B(somestring)。结果;这个问题将不复存在。

我很为C#,谁能告诉我,为什么会发生?是否有任何其他更好的办法来解决这个问题。

以上是关于httpClient.GetAsync电话扔System.ArgumentException:无法确定JSON对象类型的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient.GetAsync,无效的 URI 异常

使用 HttpClient.GetAsync() 时如何确定 404 响应状态

HttpClient.GetAsync 一次只执行 2 个请求?

如何阻止 HttpClient.GetAsync(uri) 挂起? [复制]

在 Azure Function 上获取数据时,HttpClient.GetAsync() 会产生 AggregateException

HttpClient.GetAsync 挂起,然后互联网在其执行过程中消失