如何将值列表反序列化为C#对象
我的应用程序接收一个JSON对象,如下所示:如何将值列表反序列化为C#对象,c#,json,.net-core,C#,Json,.net Core,我的应用程序接收一个JSON对象,如下所示: { "names": [ "name_1", "name_2" ] } 我想将其反序列化为Person对象的列表,定义为: 班级人员 { 公共字符串名称{set;get;} } 目前,我正在将JSON对象反序列化为字符串列表,然后手动创建Person列表,如下所示: var name=JsonConvert.DeserializeObject(json); var people=新列表(); foreach(名称中的变量名
{
"names": [
"name_1",
"name_2"
]
}
我想将其反序列化为Person
对象的列表,定义为:
班级人员
{
公共字符串名称{set;get;}
}
目前,我正在将JSON对象反序列化为字符串列表,然后手动创建Person
列表,如下所示:
var name=JsonConvert.DeserializeObject(json);
var people=新列表();
foreach(名称中的变量名称)
添加(newperson(){Name=Name});
相反,我对以下内容感兴趣:
var people=JsonConvert.DeserializeObject(json);
我正在将Person
反序列化器实现为:
公共类PersonJsonConverter:JsonConverter
{
私人现成字典(u property mappings);;
公共人员JSONConverter()
{
_propertyMappings=新字典
{
{“姓名”,姓名(人名)}
};
}
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType.GetTypeInfo().IsClass;
}
公共重写对象ReadJson(
JsonReader阅读器,
类型objectType,
对象现有值,
JsonSerializer(序列化程序)
{
对象实例=Activator.CreateInstance(objectType);
var props=objectType.GetTypeInfo().DeclaredProperties.ToList();
JObject obj=JObject.Load(读卡器);
foreach(obj.Properties()中的JProperty jsonProperty)
{
if(!\u propertyMappings.TryGetValue(jsonProperty.Name,out var Name))
name=jsonProperty.name;
PropertyInfo prop=props.FirstOrDefault(
pi=>pi.CanWrite&&pi.Name==Name);
道具?设定值(
比如,,
jsonProperty.Value.ToObject(prop.PropertyType,序列化程序));
}
返回实例;
}
}
此反序列化程序可以反序列化对象,例如:
{
"names": [
"name": "name_1",
"name": "name_2"
]
}
但不是
{
"names": [
"name_1",
"name_2"
]
}
请注意,我的应用程序可以接收这两种类型的JSON对象,因此最好为这两种类型都使用一个通用的反序列化程序。您必须将
名称反序列化为类似JArray
的内容,然后foreach
每个条目都有一个新人('name')
。接收到的JSON与所需的模式不匹配。您必须手动转换它。您必须将名称
反序列化为类似JArray的东西,然后foreach
每个条目都有一个新人('name')
。接收到的JSON与所需的模式不匹配。您必须手动转换它。请尝试以下操作:
class Person
{
public string Name { set; get; }
}
public class PersonJsonConverter : JsonConverter
{
// private readonly Dictionary<string, string> _propertyMappings;
public PersonJsonConverter()
{
/*_propertyMappings = new Dictionary<string, string>
{
{"name", nameof(Person.Name)}
};*/
}
public override bool CanConvert(System.Type objectType)
{
return objectType.GetTypeInfo().IsClass;
}
public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
{
object instance = Activator.CreateInstance(objectType);
// List<T> implements the non-generic IList interface
IList list = (IList)instance;
var typeInfo = objectType.GetTypeInfo();
var props = typeInfo.DeclaredProperties.ToList();
PropertyInfo prop = props.FirstOrDefault(pi => pi.PropertyType == typeof(Person));
JObject obj = JObject.Load(reader);
var namesArray = obj["names"]; // you can use this instead of for loop on obj.Properties.
/*foreach (JProperty jsonProperty in obj.Properties())
{
if (jsonProperty.Name == "names")
{
var namesArray = JArray.Parse(jsonProperty.Value.ToString());
*/
if (namesArray.Type == JTokenType.Array && prop != null)
{
foreach (var ja in namesArray)
{
object personInstance = Activator.CreateInstance(prop.PropertyType);
PropertyInfo personNamePropInfo = prop.PropertyType.GetProperty(nameof(Person.Name));
personNamePropInfo.SetValue(personInstance,
Convert.ChangeType(ja, personNamePropInfo.PropertyType), null);
list.Add(personInstance); // Whatever you need to add
}
}
/* break;
}
}*/
return instance;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
班级人员
{
公共字符串名称{set;get;}
}
公共类PersonJsonConverter:JsonConverter
{
//私人现成字典(u property mappings);;
公共人员JSONConverter()
{
/*_propertyMappings=新字典
{
{“姓名”,姓名(人名)}
};*/
}
公共覆盖布尔CanConvert(System.Type objectType)
{
返回objectType.GetTypeInfo().IsClass;
}
公共重写对象ReadJson(JsonReader阅读器、System.Type对象类型、对象existingValue、JsonSerializer序列化程序)
{
对象实例=Activator.CreateInstance(objectType);
//列表实现非通用IList接口
IList list=(IList)实例;
var typeInfo=objectType.GetTypeInfo();
var props=typeInfo.DeclaredProperties.ToList();
PropertyInfo prop=props.FirstOrDefault(pi=>pi.PropertyType==typeof(Person));
JObject obj=JObject.Load(读卡器);
var namesArray=obj[“names”];//您可以在obj.Properties上使用它而不是for循环。
/*foreach(obj.Properties()中的JProperty jsonProperty)
{
if(jsonProperty.Name==“Name”)
{
var namesArray=JArray.Parse(jsonProperty.Value.ToString());
*/
if(namesArray.Type==JTokenType.Array&&prop!=null)
{
foreach(namesArray中的var ja)
{
object personInstance=Activator.CreateInstance(prop.PropertyType);
PropertyInfo personNamePropInfo=prop.PropertyType.GetProperty(nameof(Person.Name));
personNamePropInfo.SetValue(personInstance,
ChangeType(ja,personNamePropInfo.PropertyType),null;
list.Add(personInstance);//需要添加的任何内容
}
}
/*中断;
}
}*/
返回实例;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
}
并按如下方式使用:
var samplejson = @"{
""names"": [
""name_1"",
""name_2""
]
}";
var obj = JsonConvert.DeserializeObject<List<Person>>(samplejson, new JsonConverter[] { new PersonJsonConverter() });
var samplejson=@”{
“姓名”:[
“名称_1”,
“”名称\u 2“”
]
}";
var obj=JsonConvert.DeserializeObject(samplejson,new JsonConverter[]{new PersonJsonConverter()});
另一个json似乎不是有效的json。
请尝试以下操作:
class Person
{
public string Name { set; get; }
}
public class PersonJsonConverter : JsonConverter
{
// private readonly Dictionary<string, string> _propertyMappings;
public PersonJsonConverter()
{
/*_propertyMappings = new Dictionary<string, string>
{
{"name", nameof(Person.Name)}
};*/
}
public override bool CanConvert(System.Type objectType)
{
return objectType.GetTypeInfo().IsClass;
}
public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
{
object instance = Activator.CreateInstance(objectType);
// List<T> implements the non-generic IList interface
IList list = (IList)instance;
var typeInfo = objectType.GetTypeInfo();
var props = typeInfo.DeclaredProperties.ToList();
PropertyInfo prop = props.FirstOrDefault(pi => pi.PropertyType == typeof(Person));
JObject obj = JObject.Load(reader);
var namesArray = obj["names"]; // you can use this instead of for loop on obj.Properties.
/*foreach (JProperty jsonProperty in obj.Properties())
{
if (jsonProperty.Name == "names")
{
var namesArray = JArray.Parse(jsonProperty.Value.ToString());
*/
if (namesArray.Type == JTokenType.Array && prop != null)
{
foreach (var ja in namesArray)
{
object personInstance = Activator.CreateInstance(prop.PropertyType);
PropertyInfo personNamePropInfo = prop.PropertyType.GetProperty(nameof(Person.Name));
personNamePropInfo.SetValue(personInstance,
Convert.ChangeType(ja, personNamePropInfo.PropertyType), null);
list.Add(personInstance); // Whatever you need to add
}
}
/* break;
}
}*/
return instance;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
班级人员
{
公共字符串名称{set;get;}
}
公共类PersonJsonConverter:JsonConverter
{
//私人现成字典(u property mappings);;
公共人员JSONConverter()
{
/*_propertyMappings=新字典
{
{“姓名”,姓名(人名)}
};*/
}
公共覆盖布尔CanConvert(System.Type objectType)
{
返回objectType.GetTypeInfo().IsClass;
}
公共重写对象ReadJson(JsonReader阅读器、System.Type对象类型、对象existingValue、JsonSerializer序列化程序)
{
对象实例=Activator.CreateInstance(objectType);
//列表实现非通用IList接口
IList list=(IList)实例;
var typeInfo=对象