如何使用默认值填充可选集合属性?

t3c*_*b0t 5 c# json json.net json-deserialization

我正在尝试反序列化代表此类的json文件的一部分.

public class Command
{
    [JsonRequired]
    public string Name { get; set; }

    [DefaultValue("Json!")]
    public string Text { get; set; }

    //[DefaultValue(typeof(Dictionary<string, string>))]
    public Dictionary<string, string> Parameters { get; set; } = new Dictionary<string, string>();
}
Run Code Online (Sandbox Code Playgroud)

其中两个属性是可选的:TextParameters.我希望它们填充默认值.

问题是我无法弄清楚如何使它适用于它们.

  • 如果我使用该DefaultValueHandling.Populate选项,Text则将填充但Parameters仍然存在null.
  • 如果我使用DefaultValueHandling.Ignore那么它将是另一种方式.
  • 如果我[DefaultValue(typeof(Dictionary<string, string>))]Parameters房产上设置它会崩溃.

Quesiton:有没有办法让它适用于所有物业?

我希望它不是null,所以我不必在代码的其他部分检查它.


我尝试过的演示:

void Main()
{
    var json = @"
[
    {
        ""Name"": ""Hallo"",
        ""Text"": ""Json!""
    },
        {
        ""Name"": ""Hallo"",
    }
]
";

    var result = JsonConvert.DeserializeObject<Command[]>(json, new JsonSerializerSettings
    {
        DefaultValueHandling = DefaultValueHandling.Populate,
        ObjectCreationHandling = ObjectCreationHandling.Reuse
    });

    result.Dump(); // LINQPad
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 4

不要通过设置指定全局DefaultValueHandling,而是使用 [JsonProperty]属性DefaultValueHandling根据需要为每个单独的属性进行设置:

public class Command
{
    [JsonRequired]
    public string Name { get; set; }

    [DefaultValue("Json!")]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
    public string Text { get; set; }

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public Dictionary<string, string> Parameters { get; set; } = new Dictionary<string, string>();
}
Run Code Online (Sandbox Code Playgroud)

然后,像这样反序列化:

var result = JsonConvert.DeserializeObject<Command[]>(json);
Run Code Online (Sandbox Code Playgroud)