json.net – 在JsonConverter的ReadJson方法中使用的existingValue参数是什么?

当创建自定义Json Converter时,需要覆盖的方法之一是:
public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)

什么是“existingValue”参数?变量名称“existingValue”在这种情况下是什么意思?

简单地说,existingValue参数给出了最终将被ReadJson方法返回的值替换的对象的现有或认值.这使得ReadJson方法有机会在确定要返回的内容时评估现有值.例如,该方法可以决定保留认值,或者如果需要,则以某种方式将其与读取器的反序列化值组合.

请考虑以下示例.该转换器将反序列化JSON中的整数值,并返回该值的总和和反序列化的字段的现有值.

class AdditiveIntConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(int));
    }

    public override object ReadJson(JsonReader reader,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或零.你可以安全地忽略它.

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...