【问题标题】:Problem Deserialising JSON response from Wikipedia API问题反序列化来自 Wikipedia API 的 JSON 响应
【发布时间】:2020-02-20 11:39:52
【问题描述】:

我正在尝试使用 Wikipedia 搜索请求 API:

https://en.wikipedia.org/w/api.php?action=query&origin=*&format=json&generator=search&gsrnamespace=0&gsrlimit=100&gsrsearch=简谐运动

然后尝试反序列化:

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 响应。有人可以建议我做错了什么吗?

【问题讨论】:

  • json本身长什么样子?
  • 在此处添加您的 Json 数据。你的班级可能有问题。
  • A Wild Assed Guess 说这是因为您的课程是私有的。因此,它不适用于另一个命名空间/程序集(例如 JSON 反序列化器)。如果您将这些类重新声明为公开会发生什么?
  • 另外,架构似乎与我从该链接获得的 JSON 不匹配。

标签: c# .net json deserialization wikipedia


【解决方案1】:

反序列化可能存在多个问题。

正如 fredrik 在 cmets 中提到的,您的课程是私有的。将它们公开应该可以解决您遇到的异常。

此外,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; }
}

【讨论】:

  • 所以我尝试公开课程并且没有改变。这是 JSON 的样子:{ "batchcomplete": "", "continue": { "gsroffset": 100, "continue": "gsroffset||" },“查询”:{“页面”:{“2443”:{“pageid”:2443,“ns”:0,“标题”:“加速”,“索引”:16},“19411913”:{“ pageid": 19411913, "ns": 0, "title": "分析动力学", "index": 90 },
  • 您是否还应用了我在公开课程旁边所做的其他更改?错误消息是否保持不变?
【解决方案2】:
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; }
}

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多