gpt4 book ai didi

json.net - JsonConverter 的 ReadJson 方法中的existingValue 参数有何用途?

转载 作者:行者123 更新时间:2023-12-01 18:44:14 25 4
gpt4 key购买 nike

创建自定义 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 属性,Value1Value2,两者都其中使用此转换器。 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 要么为零。您可以安全地忽略它。

关于json.net - JsonConverter 的 ReadJson 方法中的existingValue 参数有何用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24347613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com