JsonConverter 的 ReadJson 方法中的existingValue 参数有何用途?

2024-02-06

创建自定义 Json 转换器时,需要重写的方法之一是:

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, 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 或零。您可以安全地忽略它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JsonConverter 的 ReadJson 方法中的existingValue 参数有何用途? 的相关文章

随机推荐