Проблема десериализации JSON ответа от API Википедии - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь использовать API запроса поиска в Википедии следующим образом:

https://en.wikipedia.org/w/api.php?action=query&origin=* & format = json & generator = search & gsrnamespace = 0 & gsrlimit = 100 & gsrsearch = Simple Harmoni c Motion

и затем пытаюсь десериализовать таким образом:

WikiSearchResults R = s1.Deserialize<WikiSearchResults>(Json);

используя эту структуру класса:

private class WikiSearchQuery{
     public WikiSearchPage[] pages { get; set; }
}

private class WikiSearchPage{
     public int pageid { get; set; }
     public string title { get; set; }
}

private class WikiSearchResults{
     public WikiSearchQuery[] query { get; set; }
}

Но я получаю это исключение:

Не определен конструктор без параметров для типа WikiSearchQuery []

Полагаю, я неправильно интерпретирую ответ JSON. Может кто-нибудь подсказать, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020
using (var client = new HttpClient())
      {
        var _reqMessage = new HttpRequestMessage();
        _reqMessage.Method = HttpMethod.Get;
        _reqMessage.RequestUri = new Uri("https://en.wikipedia.org/w/api.php?action=query&origin=*&format=json&generator=search&gsrnamespace=0&gsrlimit=100&gsrsearch=S");

        var response = client.SendAsync(_reqMessage);
        response.Wait();

        var result = response.Result;
        var resultJson = result.Content.ReadAsStringAsync().Result;

        var tes = JsonConvert.DeserializeObject<WikiSearchResults>(resultJson);
      }

Модели:

public class WikiSearchQuery
{
  [JsonProperty("pages")]
  public Dictionary<object, WikiSearchPage> Pages { get; set; }
}

public class WikiSearchPage
{
  [JsonProperty("pageid")]
  public int Pageid { get; set; }
  [JsonProperty("title")]
  public string Title { get; set; }
}

public class WikiSearchResults
{
  [JsonProperty("query")]
  public WikiSearchQuery Query { get; set; }
}
1 голос
/ 20 февраля 2020

Вероятно, существует множество проблем с десериализацией.

Как уже упоминалось в комментариях Фредрика, ваши занятия являются закрытыми. Их публикация c должна исправить возникшее исключение.

Кроме того, WikiSearchQuery существует только один раз и не содержит массив объектов, он содержит словарь.

Это проблемы, которые я вижу прямо сейчас, так что это может работать:

public class WikiSearchQuery{
     public Dictionary<string,WikiSearchPage> pages { get; set; }
}

public class WikiSearchPage{
     public int pageid { get; set; }
     public string title { get; set; }
}

public class WikiSearchResults{
     public WikiSearchQuery query { get; set; }
}
...