【问题标题】:Cannot deserialize the current JSON array into type [duplicate]无法将当前 JSON 数组反序列化为类型 [重复]
【发布时间】:2021-07-26 19:24:08
【问题描述】:

反序列化时出现以下错误。下面给出了我一直在尝试反序列化的编码块。

错误:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 “主题”,因为该类型需要 JSON 对象 (例如 {"name":"value"})正确反序列化。要修复此错误,请更改 JSON 到 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或 实现集合接口(例如 ICollection、IList)的类型,例如 List 可以是 从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。路径 'Students[3].Subject'.....

JSON:

 {
   "Students":[
      {
         "Name":"Mr. X",
         "Class":"Ten",
         "Roll":5,
         "Subject":{
            "Name":"Math",
            "Marks":90
         }
      },
      {
         "Name":"Mr. Y",
         "Class":"Ten",
         "Roll":7,
         "Subject":{
            "Name":"Math",
            "Marks":80
         }
      },
      {
         "Name":"Mr. Z",
         "Class":"Ten",
         "Roll":8,
         "Subject":{
            "Name":"Math",
            "Marks":75
         }
      },
      {
         "Name":"Mr. A",
         "Class":"Ten",
         "Roll":1,
         "Subject":[
            {
               "Name":"Math",
               "Marks":95
            },
            {
               "Name":"English",
               "Marks":75
            }
         ]
      }
   ]
}

Program.cs:

Student_Collection students = new Student_Collection();

.....

string jsonString = await response.Content.ReadAsStringAsync();

  var settings = new JsonSerializerSettings
    {
      NullValueHandling = NullValueHandling.Ignore,
      MissingMemberHandling = MissingMemberHandling.Ignore
    };

// this the line where I am getting the error 
students = JsonConvert.DeserializeObject<Student_Collection>(jsonString, settings); 

Subject.cs:

class Subject
 {  
    public string Name { get; set; }
    public int Marks { get; set; }       
 }

Student.cs

class Student
 {  
    public string Name { get; set; }
    public string Class { get; set; }
    public int Roll { get; set; }
    public Subject Subject { get; set; }
 }

Student_Collection.cs

class Student_Collection
 {  
    public List<Student> students { get; set; }
 }

【问题讨论】:

  • 还发布了您要反序列化的 json,很可能 json 中有一些语法错误。你也可以通过一些在线工具来验证json。
  • 听起来你试图反序列化的json实际上是一个json数组而不是一个包含数组的对象。反序列化程序需要一个包含数组的对象 {"students":[x,y,z]} 而不是单独的数组 [x,y,z]。
  • 您的错误 "Path 'Students[3].Subject'".." 引用了 Students 数组中的 3d 索引项,而示例 json 中只有 2 个。
  • RollMarks 应该是 int 类型 dotnetfiddle.net/bSbBQR 但无论哪种方式,您提供的 json 都不会导致问题...
  • 以上 json 在我的控制台应用程序中为我工作我能够反序列化并从对象 students.students 读取属性您使用的是 Newtonsoft.Json 哪个版本?

标签: c# json deserialization


【解决方案1】:

在这个元素中,主题是一个对象

元素 1:

  {
     "Name":"Mr. Z",
     "Class":"Ten",
     "Roll":8,
     "Subject":{
        "Name":"Math",
        "Marks":75
     }
  },

但是看看最后一个元素 Subject 是一个数组/集合 元素 3

  {
     "Name":"Mr. A",
     "Class":"Ten",
     "Roll":1,
     "Subject":[
        {
           "Name":"Math",
           "Marks":95
        },
        {
           "Name":"English",
           "Marks":75
        }
     ]
  }

JSON 必须一致 Subject 应该是一个集合或者一个对象

如果你想让主题成为集合,它应该像这样定义

元素 3 将适用于以下情况:

public List<Subject> Subject { get; set; }

但元素 1 可以使用

public Subject Subject { get; set; }

如果您仔细查看元素 3 是集合主题:[],其中括号显示一个数组/集合,而如果您查看元素 1 主题:{ },这里的大括号显示一个对象,这就是您必须修复数据的原因,无论您在何处返回数据,它都应将 Subject 属性作为数组或作为单个对象返回。

这里是example了解你可以玩它

【讨论】:

  • 但是使用public List&lt;Subject&gt; Subject { get; set; } 会产生新的错误,例如Cannot deserialize the current JSON object.....Path 'Students[0].Subject'.....
  • 你的 JSON 不一致,不确定它来自哪里,你必须选择一个,要么是数组,要么不是。一个元素的数组很好,所以对于第一个对象,你可以有 "Subject":[ { "Name":"Math", "Marks":75 } ] 但你不能把它作为一些条目的对象和其他人的数组。即你得到的第一个错误是因为最后一个条目确实将主题定义为一个数组,当你修复它时你会得到一个错误,因为你的其他条目没有将主题定义为一个数组。
  • 我更新了我的答案,按照示例链接并更新这些属性,如答案中所示。希望能帮助你理解。
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多