【发布时间】:2020-02-12 19:12:39
【问题描述】:
我的应用程序收到一个 JSON 对象:
{
"names": [
"name_1",
"name_2"
]
}
我想将其反序列化为Person对象列表,定义为:
class Person
{
public string Name { set; get; }
}
目前,我将 JSON 对象反序列化为字符串列表,然后手动创建 Person 列表,如下所示:
var names = JsonConvert.DeserializeObject<List<string>>(json);
var people = new List<Person>();
foreach(var name in names)
people.Add(new Person(){ Name = name });
相反,我对以下内容感兴趣:
var people = JsonConvert.DeserializeObject<List<Person>>(json);
我将Person 解串器实现为:
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(Type objectType)
{
return objectType.GetTypeInfo().IsClass;
}
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
object instance = Activator.CreateInstance(objectType);
var props = objectType.GetTypeInfo().DeclaredProperties.ToList();
JObject obj = JObject.Load(reader);
foreach (JProperty jsonProperty in obj.Properties())
{
if (!_propertyMappings.TryGetValue(jsonProperty.Name, out var name))
name = jsonProperty.Name;
PropertyInfo prop = props.FirstOrDefault(
pi => pi.CanWrite && pi.Name == name);
prop?.SetValue(
instance,
jsonProperty.Value.ToObject(prop.PropertyType, serializer));
}
return instance;
}
}
这个反序列化器可以反序列化对象,例如:
{
"names": [
"name": "name_1",
"name": "name_2"
]
}
但不是
{
"names": [
"name_1",
"name_2"
]
}
请注意,我的应用程序可以接收这两种类型的 JSON 对象,因此最好为这两种类型使用一个通用的反序列化器。
【问题讨论】: