这个JSON文件有什么问题?Can';不能反序列化

这个JSON文件有什么问题?Can';不能反序列化,json,json.net,json-deserialization,Json,Json.net,Json Deserialization,我对JSON文件有一个问题,它是一个国家/地区对象列表,如下所示: { "Countries": [ { "Code": "AFG", "Name": "Afghanistan", "Population": 38928346 }, { "Code": "ALA", "Name": "Åland Islands",

我对JSON文件有一个问题,它是一个国家/地区对象列表,如下所示:

{
    "Countries": [
        {
            "Code": "AFG",
            "Name": "Afghanistan",
            "Population": 38928346
        },
        {
            "Code": "ALA",
            "Name": "Åland Islands",
            "Population": 28007
        },
        {
            "Code": "ALB",
            "Name": "Albania",
            "Population": 2877797
        },
        {
            "Code": "DZA",
            "Name": "Algeria",
            "Population": 43851044
        },
        {
            "Code": "ASM",
            "Name": "American Samoa",
            "Population": 55191
        }
    ]
}
我试图使用此代码读取它并将其反序列化为列表对象:

Stream? countriesResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.Countries.json");

if (countriesResourceStream == null)
{
    return;
}

var countries = new List<Country>();

using (StreamReader reader = new StreamReader(countriesResourceStream))
{
    var serializer = new JsonSerializer();
    countries = serializer.Deserialize<List<Country>>(new JsonTextReader(reader));
}
流?countriesResourceStream=Assembly.GetExecutionGassembly().GetManifestResourceStream(“MyProject.Countries.json”);
如果(countriesResourceStream==null)
{
返回;
}
var countries=新列表();
使用(StreamReader=新StreamReader(countriesResourceStream))
{
var serializer=new JsonSerializer();
countries=serializer.Deserialize(新的JsonTextReader(reader));
}
但是,serializer.Deserialize方法引发异常:

'无法将当前JSON对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.List`1[MyProject.Models.EntityFramework.Country]”类型,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。 若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的正常.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化


我的JSON有什么问题?我尝试了Newtonsoft和System.Text.Json。

问题在于,您的Json并不表示国家列表,而是表示包含国家列表的对象。你需要另一门课:

class CountryListContainer
{
    public List<Country> Countries { get; set; }
}

Fiddle:

JSON本身没有问题,除非它与您反序列化到的.net数据类型不匹配。看起来您是在告诉它JSON应该是一个国家对象列表,但事实并非如此;它是具有国家值的顶级对象;该值映射到对象列表。如果让JSON文件从
[
开始,到
]
结束,那么代码可能会正常工作。(“大概”因为这不是一个不包括国家定义的问题,所以我们无法测试我们的答案)。谢谢你,布莱恩,你让我的一天过得轻松了一点,现在一切顺利,天知道我需要它。我选择了第二个选项,我不想要一个包含列表的“Countries”对象,但很明显我的想法和JSON有冲突。很高兴我能帮上忙。
using (StreamReader streamReader = new StreamReader(countriesResourceStream))
using (JsonTextReader jsonReader = new JsonTextReader(streamReader))
{
    var serializer = new JsonSerializer();
    countries = serializer.Deserialize<CountryListContainer>(jsonReader).Countries;
}
[
  {
    "Code": "AFG",
    "Name": "Afghanistan",
    "Population": 38928346
  },
  {
    "Code": "ALA",
    "Name": "Åland Islands",
    "Population": 28007
  },
  {
    "Code": "ALB",
    "Name": "Albania",
    "Population": 2877797
  },
  {
    "Code": "DZA",
    "Name": "Algeria",
    "Population": 43851044
  },
  {
    "Code": "ASM",
    "Name": "American Samoa",
    "Population": 55191
  }
]