Ошибка синтаксического анализа JSON при попытке использовать Face API

#c# #json #face-api

#c# #json #face-api

Вопрос:

Я пытаюсь отправить фотографию из Imgur через URL-адрес в Microsoft Face API и получить идентификатор лица из ответа Json, но когда я пытаюсь запустить код, я всегда получаю ошибку синтаксического анализа JSON. Я понятия не имею, что я делаю не так.

Я попытался сделать этот запрос через Postman, и там все работает нормально, но в c # это просто не сработает.

Не могли бы вы мне помочь, пожалуйста?

     static void TryFunction()
    {
        string host = "https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect?returnFaceId=true";
        string subscriptionKey = "...";

        body = new System.Object[] { new { url = @"https://i.imgur.com/... .png" } };
        var requestBody = JsonConvert.SerializeObject(body);

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage())
        {
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri(host);
            request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");

            var response = client.SendAsync(request).Resu<
            var jsonResponse = response.Content.ReadAsStringAsync().Resu<

            dynamic json = JsonConvert.DeserializeObject(jsonResponse);
            Console.WriteLine(jsonResponse);
        }
    }
 

{«ошибка»: {«код»: «Неверный аргумент», «сообщение»: «Ошибка синтаксического анализа JSON».}}

Тело запроса C # выглядит следующим образом:

 [{"url":"https://i.imgur.com/... .png"}]
 

В то время как тело запроса Postman выглядит следующим образом:

 { "url": "https://i.imgur.com/... .png" }
 

Комментарии:

1. В чем разница между вашим запросом C # и вашим запросом Postman? Вы можете использовать такой инструмент, как Telerik’s Fiddler, чтобы выяснить это. Единственное, что бросается мне в глаза (не зная face API), это: вы должны передавать массив или один объект?

2. Разница между запросом тела. Вот как это выглядит: [{"url":"https://i.imgur.com/... .png"}] Вот как это должно выглядеть: { "url": "https://i.imgur.com/... .png" }

Ответ №1:

Основываясь на вашем комментарии, вы ожидаете получить один объект, но генерируете массив. Это сводится к следующей строке кода:

 body = new System.Object[] { new { url = @"https://i.imgur.com/... .png" } };
 

Это создает массив с одним элементом в нем. На самом деле вам нужен всего один элемент:

 body = new { url = @"https://i.imgur.com/... .png" };
 

Обратите внимание, что [ ] в JSON — это массив, а { } в JSON — объект.