代码之家  ›  专栏  ›  技术社区  ›  t3chb0t

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

  •  5
  • t3chb0t  · 技术社区  · 7 年前

    我正在尝试反序列化表示此类的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>();
    }
    

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

    问题是,我不知道如何让它同时适用于他们两个。

    • 如果我使用 DefaultValueHandling.Populate 然后选择 文本 将填充,但 参数 残余 null .
    • 如果我使用 DefaultValueHandling.Ignore 那就反过来了。
    • 如果我设置 [DefaultValue(typeof(Dictionary<string, string>))] 参数 它会崩溃的。

    问题 :有没有办法使其适用于所有属性?

    我希望它不为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 回复  |  直到 7 年前
        1
  •  4
  •   Brian Rogers    7 年前

    而不是指定全局 DefaultValueHandling 通过设置,使用 [JsonProperty] 属性来设置 默认值处理 由于您需要为每个单独的财产:

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