簡單地說,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
和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
當然,這只是一個人爲的例子。實際上,在實現JsonConverter時沒有太多需要使用existingValue
參數,並且大多數時候它的值將爲null或零。你可以放心地忽略它。