C# json.net无法反序列化到对象列表

C# json.net无法反序列化到对象列表,c#,json.net,C#,Json.net,我正在尝试创建一个JSON文件,其中包含计算机部件列表 我的零件课 namespace Part_Class { public class Part_DB : IEnumerable<Part> { public List<Part> Parts = new List<Part>(); public IEnumerator<Part> GetEnumerator() {

我正在尝试创建一个JSON文件,其中包含计算机部件列表

我的零件课

namespace Part_Class
{
    public class Part_DB : IEnumerable<Part>
    {
        public List<Part> Parts = new List<Part>();

        public IEnumerator<Part> GetEnumerator()
        {
            return this.Parts.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

    public class Model
    {
        public String Name { get; set; } // E6430, M4600, T4220

        public Model(string Name)
        {
            this.Name = Name;
        }
    }

    public class Category
    {
        public String Name { get; set; } // E6430, M4600, T4220

        public Category(string Name)
        {
            this.Name = Name;
        }
    }

    public class Part
    {
        public List<Model> Models = new List<Model>(); //E6420
        public string PartNumber { get; set; } //PPHPX, UK717
        public string Description { get; set; } // "320GB Hard Drive", "E6410 keyboard"
        public List<Category> Categories = new List<Category>(); //Hard Drive, Keyboard 
        public bool HeroKit { get; set; } //Y or N
    }
}
这将输出以下json文件

[
  {
    "Models": [
      {
        "Name": "M4600"
      },
      {
        "Name": "M4700"
      }
    ],
    "Categories": [
      {
        "Name": "Hard Drive"
      }
    ],
    "PartNumber": "PPHPX",
    "Description": "320GB Spindle Hard Drive",
    "HeroKit": true
  },
  {
    "Models": [
      {
        "Name": "E6410"
      }
    ],
    "Categories": [
      {
        "Name": "Keyboard"
      }
    ],
    "PartNumber": "UK717",
    "Description": "102 Key Non Backlit",
    "HeroKit": true
  }
]
我倒过来有困难。将JSON文件反序列化回Part_DB对象。这是我的尝试

List<string> errors = new List<string>();

try
{
    //Create a string of the JSON File
    string jsonStr;
    using (StreamReader file = File.OpenText(@"C:\****\Parts.json"))
    {
        jsonStr = file.ReadToEnd();
    }

    // Deserilize object into the Part_DB
    Part_DB Stored = JsonConvert.DeserializeObject<Part_DB>(jsonStr,
        new JsonSerializerSettings
        {
            Error = delegate(object senders, Newtonsoft.Json.Serialization.ErrorEventArgs args)
            {
                errors.Add(args.ErrorContext.Error.Message);
                //Debug.WriteLine(args.ErrorContext.Error.Message);
                args.ErrorContext.Handled = true;
            },
        });
}
catch (Exception ex) {
    Console.WriteLine(ex);
}
List errors=newlist();
尝试
{
//创建JSON文件的字符串
字符串jsonStr;
使用(StreamReader file=file.OpenText(@“C:\***\Parts.json”))
{
jsonStr=file.ReadToEnd();
}
//将对象反序列化到Part_DB中
Part_DB Stored=JsonConvert.DeserializeObject(jsonStr,
新JsonSerializerSettings
{
Error=delegate(对象发送者,Newtonsoft.Json.Serialization.ErrorEventArgs args args)
{
添加(args.ErrorContext.Error.Message);
//Debug.WriteLine(args.ErrorContext.Error.Message);
args.ErrorContext.Handled=true;
},
});
}
捕获(例外情况除外){
控制台写入线(ex);
}

我认为,对于Json.NET而言,
Part_DB
只是一个对象(它恰好是可枚举的,但这并不重要),因此它正在寻找更像以下内容的Json:

{“Parts”:这里应该是序列化的输出}


从序列化中获得的输出实际上只是序列化的
列表
,因此请先尝试对其进行反序列化,创建一个新的Part\u DB对象,然后将该列表分配给Parts属性。

我怀疑这与实际继承自
IEnumerable
的顶级模型有些奇怪有关。我能够使用以下方法成功地将生成的文件反序列化为Part_DB:

var newObj = JsonConvert.DeserializeObject<List<Part>>( json );
var partDb = new Part_DB();
partDb.Parts.AddRange( newObj );
然后可以直接反序列化为该类型

JsonConvert.DeserializeObject<Part_DB>( json );

你有什么例外?谢谢。诀窍是从Part_DB中的IEnumerable中删除继承。我需要它来迭代部分,但是Part_DB中的部分列表属性继承了它。因此,
foreach(Stored.Parts中的P部分){Console.WriteLine(P.PartNumber);}
工作得很好。
public class Part_DB
{
    public List<Part> Parts = new List<Part>();
}
JsonConvert.DeserializeObject<Part_DB>( json );
{
  "Parts": [
    {
      "Models": [
        { "Name": "M4600" },
        { "Name": "M4700" }
      ],
      "Categories": [
        { "Name": "Hard Drive" }
      ],
      "PartNumber": "PPHPX",
      "Description": "320GB Spindle Hard Drive",
      "HeroKit": true
    },
    {
      "Models": [
        { "Name": "E6410" }
      ],
      "Categories": [
        { "Name": "Keyboard" }
      ],
      "PartNumber": "UK717",
      "Description": "102 Key Non Backlit",
      "HeroKit": true
    }
  ]
}