【问题标题】:Can't get JSON to deserialize into a list?无法让 JSON 反序列化为列表?
【发布时间】:2020-10-07 21:40:54
【问题描述】:

我正在开发一个机器人,它将从存储在 JSON 中的琐事问题列表中提取,但它似乎无法将 JSON 识别为列表,即使我认为我说得对。

相关代码: C#:

class Question
{
    public string Catagory { get; set; }
    public string QuestionText { get; set; }
    public string Answer { get; set; }
    public int Points { get; set; }
    public bool asked { get; set; }
}

class TriviaGame
{
    public List<Question> QuestionList = new List<Question>();

    public TriviaGame()
    {
        QuestionList = JsonConvert.DeserializeObject<List<Question>>(File.ReadAllText(@"filepath"));
    }

JSON:

{
    "Question" : [
    {
        "Catagory": "text",
        "QuestionText": "text",
        "Answer": "text",
        "Points": integer,
        "Asked": false
    },
    {
        "Catagory": "text",
        "QuestionText": "text",
        "Answer": "text",
        "Points": integer,
        "Asked": false
    },
    {
        "Catagory": "text",
        "QuestionText": "text",
        "Answer": "text",
        "Points": integer,
        "Asked": false
    }]
}

用占位符文本替换了 JSON 文件中的文本,但值不是它验证的问题。 出于隐私原因,将实际文件路径替换为单词文件路径,但文件路径有效,因为它确实会在引发错误之前提取文件。

给定错误:

Newtonsoft.Json.JsonSerializationException: '无法反序列化 当前 JSON 对象(例如 {"name":"value"})转换为类型 'System.Collections.Generic.List`1[TriviaBot.Question]' 因为 type 需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。到 修复此错误或者将 JSON 更改为 JSON 数组(例如 [1,2,3]) 或更改反序列化类型,使其成为普通的 .NET 类型(例如 不是像整数这样的原始类型,不是像数组这样的集合类型 或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。路径“问题”,第 2 行,位置 13。'

【问题讨论】:

  • 这能回答你的问题吗? Deserialize Json to List C#
  • 如果您有兴趣,那是一个 DataSet,其中包含一个名为 Question 的 DataTable。所以,你可以把它反序列化为JsonConvert.DeserializeObject&lt;DataSet&gt;(...),如果你把那些integer的东西换成一个实际的值,那就是。
  • 或DataTable直接:var q = JsonConvert.DeserializeObject&lt;DataTable&gt;(JObject.Parse(json).SelectToken("Question").ToString());或问题对象列表,只需将DataTable替换为List&lt;Question&gt;即可。

标签: c# json serialization deserialization


【解决方案1】:

问题出在 JSON 文件中,它描述的是地图而不是数组。 尝试删除

    {
    "Question" :

在开头,} 在结尾。

【讨论】:

    【解决方案2】:

    您拥有的 json 结构有一个名为 Question 的属性,它有一个项目数组,而不是一个问题数组。正如其他答案所述,您可以修改 json 文件并删除 Question 属性。或者,如果您无法修改该结构(例如,如果您从不属于您的服务中获取它),则可以按如下方式修改您的类定义:

    class Items
    {
        public List<Item> Question {get;set;}
    } 
    class Item
    {
        public string Catagory { get; set; }
        public string QuestionText { get; set; }
        public string Answer { get; set; }
        public int Points { get; set; }
        public bool asked { get; set; }
    }
    

    然后去加载对象。

    public List<Item> QuestionList = new List<Item>();
    
    public TriviaGame()
    {
        var deserialized = JsonConvert.DeserializeObject<Items>(File.ReadAllText(@"filepath"));
        QuestionList = deserialized.Question;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多