解析期间出现 JSON 错误

本文关键字:JSON 错误 | 更新日期: 2023-09-27 18:36:40

一直在寻找有关如何解析此 json 的信息,但我尝试的所有内容都失败了。

我正在尝试使用以下代码解析 JSON:

var client = new WebClient();
client.Headers.Add("User-Agent", "Nobody");
var response = client.DownloadString(new Uri("https://api.worldoftanks.ru/wot/encyclopedia/tanks/?application_id=demo"));
Response asd = JsonConvert.DeserializeObject<Response>(response);

我还在不同的文件中设置了这些类:

public class Response
{
    public string status { get; set; }
    public int count { get; set; }
    public List<Tank> data { get; set; }
}
public class Tank
{
    public string nation_i18n { get; set; }
    public string name { get; set; }
    public int level { get; set; }
    public string image { get; set; }
    public string image_small { get; set; }
    public string nation { get; set; }
    public bool is_premium { get; set; }
    public string type_i18n { get; set; }
    public string contour_image { get; set; }
    public string short_name_i18n { get; set; }
    public string name_i18n { get; set; }
    public string type { get; set; }
    public int tank_id { get; set; }
}

它们与URL返回的数据相同(请打开它,您将看到它是如何构建的)

我认为出错的一件事是,使用响应的"数据"标签而不是为每个坦克使用"Tank"标签,他们实际上将其命名为单独的 ID。(同样,请参阅示例网址)

有人可以帮我解决这个问题吗?目前我收到错误:

类型为"Newtonsoft.Json.JsonSerializationException"的未处理异常发生在 Newtonsoft.Json.dll 附加信息:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List'1[WotApp.Classes.Tank]',因为 类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。 若要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的基元类型,不是集合类型 如数组或列表),可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制其 从 JSON 对象反序列化。 路径"data.1",第 1 行,位置 39。

希望你们能帮到大家。我已经坚持了很长时间:(

解析期间出现 JSON 错误

也在寻找和控制台应用程序测试答案,@Alexander和@dotctor的评论实际上是正确的答案;)因此,您的类必须如下所示:

public class Response
{
  public string status { get; set; }
  public int count { get; set; }
  public Dictionary<String, Tank> data { get; set; }
}

这是另一个处理完全相同问题的SO问题。

我的程序列表:

namespace SO27839862
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                WebClient client = new WebClient();
                client.Headers.Add("User-Agent", "Nobody");
                String response = client.DownloadString(new Uri("https://api.worldoftanks.ru/wot/encyclopedia/tanks/?application_id=demo"));
                Response asd = JsonConvert.DeserializeObject<Response>(response);
            }
            catch (Exception ex)
            {
            }
        }
    }
    public class Response
    {
        public string status { get; set; }
        public int count { get; set; }
        public Dictionary<String, Tank> data { get; set; }
    }
    public class Tank
    {
        public string nation_i18n { get; set; }
        public string name { get; set; }
        public int level { get; set; }
        public string image { get; set; }
        public string image_small { get; set; }
        public string nation { get; set; }
        public bool is_premium { get; set; }
        public string type_i18n { get; set; }
        public string contour_image { get; set; }
        public string short_name_i18n { get; set; }
        public string name_i18n { get; set; }
        public string type { get; set; }
        public int tank_id { get; set; }
    }
}