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

时间:2017-11-24 19:48:14

标签: 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>();
}

其中两个属性是可选的: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
}

1 个答案:

答案 0 :(得分: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>();
}

然后,像这样反序列化:

var result = JsonConvert.DeserializeObject<Command[]>(json);