繁体   English   中英

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

[英]Set Default value for missing Complex properties with JSON.net (JsonConvert.SerializeObject or JsonConvert.DeSerializeObject)

我有一个要求,我需要使用JsonPropertyDefaultValue为以下复杂属性Instances设置默认值。

我知道我们可以为下面链接中提到的原始属性实现这一点,但需要知道如何为复杂的属性做到这一点。

JSON.net 的缺失属性的默认值

下面是我需要使用DefaultValue()设置的默认Instances值。 请让我知道如何实现这一目标。

要设置为Instances属性的默认值:

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; }
}

如您所见,属性仅支持常量值,因此您不能在属性中设置复杂值。 如果要在反序列化过程中为复杂属性设置默认值,一个好的方法是使用序列化回调方法,如下所示。

这个想法是向 class 添加一个方法,序列化程序将在 object 的反序列化完成后调用该方法。 回调必须是接受StreamingContext作为其唯一参数的void方法,并且必须使用[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 }
            };
        }
    }
}

这是一个演示这个概念的工作小提琴: https://dotnetfiddle.net/uCGP5X

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM