简单地说,existingValue
参数为您提供对象的现有值或默认值,该值最终将替换为从ReadJson
方法。这给出了ReadJson
方法在确定返回内容时评估现有值的机会。例如,如果需要,该方法可以决定保留默认值,或者以某种方式将其与来自读取器的反序列化值结合起来。
考虑以下示例。此转换器将从 JSON 反序列化一个整数值,并返回该值与要反序列化到的字段的现有值的总和。
class AdditiveIntConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(int));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
return (int)existingValue + token.ToObject<int>();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
现在假设我们有一堂课Foo
其中有两个int
特性,Value1
and Value2
,两者都使用此转换器。Value1
被指定为默认值42
在构造函数中,同时Value2
通常的默认值为零。
class Foo
{
[JsonConverter(typeof(AdditiveIntConverter))]
public int Value1 { get; set; }
[JsonConverter(typeof(AdditiveIntConverter))]
public int Value2 { get; set; }
public Foo()
{
Value1 = 42;
}
}
如果我们将一些数据反序列化到此类中......
class Program
{
static void Main(string[] args)
{
string json = @"{ ""Value1"" : 18, ""Value2"" : 33 }";
Foo foo = JsonConvert.DeserializeObject<Foo>(json);
Console.WriteLine("Value1: " + foo.Value1);
Console.WriteLine("Value2: " + foo.Value2);
}
}
...我们得到以下结果:
Value1: 60
Value2: 33
当然,这只是一个人为的例子。在实际应用中,没有太大的必要使用existingValue
实现 JsonConverter 时的参数,大多数情况下其值将为 null 或零。您可以安全地忽略它。