这个JSON文件有什么问题?Can';不能反序列化
我对JSON文件有一个问题,它是一个国家/地区对象列表,如下所示:这个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",
{
"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
}
]