gpt4 book ai didi

c# - 使用 JSON.net(JsonConvert.SerializeObject 或 JsonConvert.DeSerializeObject)为缺少的复杂属性设置默认值

转载 作者:行者123 更新时间:2023-12-04 07:54:13 25 4
gpt4 key购买 nike

我有一个要求,我需要将默认值设置为下面的复杂属性 Instances使用 JsonPropertyDefaultValue .
我知道我们可以为以下链接中提到的原始属性实现这一点,但需要知道我们如何为复杂属性做到这一点。
Default value for missing properties with JSON.net
以下是默认 Instances我需要使用 DefaultValue() 设置的值.请让我知道如何实现这一目标。
默认值设置为 Instances属性(property):

Instance instance = new Instance();
instance.Name = "XYZ";
instance.MyProperty = 11;

List<Instance> Instances = new List<Instance>();
Instances.Add(instance);
代码片段:
public class DataSettings
{
public DataSettings()
{
Instances = new List<Instance>();
}

[DefaultValue()] //How can I mention the above default value here ?
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
public List<Instance> Instances { get; set; }
}

public class Instance
{
public string Name { get; set; }
public int MyProperty { get; set; }
}

最佳答案

如您所见,属性仅支持常量值,因此您不能在属性中设置复杂值。如果要在反序列化过程中为复杂属性设置默认值,一个好方法是使用 serialization callback方法,如下图。
这个想法是向您的类添加一个方法,序列化程序将在对象的反序列化完成后调用该方法。回调必须是 void接受 StreamingContext 的方法作为其唯一参数,并且必须用 [OnDeserialized] 标记属性。方法的名称无关紧要。
在回调方法中,您可以检查 Instances 是否存在列表已填充,如果没有,您可以根据需要设置默认值。

public class DataSettings
{
public DataSettings()
{
Instances = new List<Instance>();
}

public List<Instance> Instances { get; set; }

[OnDeserialized]
internal void SetDefaultValuesAfterDeserialization(StreamingContext context)
{
if (Instances == null || !Instances.Any())
{
Instances = new List<Instance>
{
new Instance { Name = "XYZ", MyProperty = 11 }
};
}
}
}
这是一个演示这个概念的工作 fiddle : https://dotnetfiddle.net/uCGP5X

关于c# - 使用 JSON.net(JsonConvert.SerializeObject 或 JsonConvert.DeSerializeObject)为缺少的复杂属性设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66787969/

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