在以下情况下,当我遇到与我正在反序列化的类型存在的JSON属性时,如何使
我有一些长这样的JSON:
CrazyItemConverter
继续正常工作?我有一些长这样的JSON:
{
"Item":{
"Name":"Apple",
"Id":null,
"Size":5,
"Quality":2
}
}
JSON被反序列化为一个非常类似于这样的类:
[JsonConverter(typeof(CrazyItemConverter))]
public class Item
{
[JsonConverter(typeof(CrazyStringConverter))]
public string Name { get; set; }
public Guid? Id { get; set; }
[JsonIgnore]
public Dictionary<string, object> CustomFields
{
get
{
if (_customFields == null)
_customFields = new Dictionary<string, object>();
return _customFields;
}
}
...
}
CrazyItemConverter
会填充已知属性的值,并将未知属性放入CustomFields中。其中的ReadJson
看起来像这样:
CrazyItemConverter
会将已知的属性填充到对象中,并将未知的属性放在CustomFields里。其中的ReadJson
方法如下:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var outputObject = Create(objectType);
var objProps = objectType.GetProperties().Select(p => p.Name).ToArray();
while (reader.Read())
{
if (reader.TokenType == JsonToken.PropertyName)
{
string propertyName = reader.Value.ToString();
if (reader.Read())
{
if (objProps.Contains(propertyName))
{
// No idea :(
// serializer.Populate(reader, outputObject);
}
else
{
outputObject.AddProperty(propertyName, reader.Value);
}
}
}
}
return outputObject;
}
在反序列化期间,当 CrazyItemConverter
遇到已知属性时,我希望它像通常一样进行操作。也就是说,尊重 [JsonConverter(typeof(CrazyStringConverter))]
用于 Name
的转换器。
我曾经使用下面的代码来设置已知属性,但是对于可空类型会抛出异常,并且不尊重我的其他 JsonConverters。
PropertyInfo pi = outputObject.GetType().GetProperty(readerValue, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
var convertedValue = Convert.ChangeType(reader.Value, pi.PropertyType);
pi.SetValue(outputObject, convertedValue, null);
有什么想法吗?
更新:我了解到serializer.Populate(reader, outputObject);
是整体反序列化的方法,但如果您希望按属性进行默认功能,则似乎不起作用。