如何使用默认值填充可选集合 属性?
How can I populate an optional collection property with a default value?
我正在尝试反序列化代表此 class 的 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
选项,那么 Text
将被填充,但 Parameters
仍然是 null
。
- 如果我使用
DefaultValueHandling.Ignore
则情况正好相反。
- 如果我在
Parameters
属性 上设置 [DefaultValue(typeof(Dictionary<string, string>))]
它会崩溃。
问题:有没有办法让它适用于所有属性?
我想让它不为空,这样我就不必在代码的其他部分检查它了。
我尝试过的演示:
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
}
不是通过设置指定全局 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);
我正在尝试反序列化代表此 class 的 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
选项,那么Text
将被填充,但Parameters
仍然是null
。 - 如果我使用
DefaultValueHandling.Ignore
则情况正好相反。 - 如果我在
Parameters
属性 上设置[DefaultValue(typeof(Dictionary<string, string>))]
它会崩溃。
问题:有没有办法让它适用于所有属性?
我想让它不为空,这样我就不必在代码的其他部分检查它了。
我尝试过的演示:
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
}
不是通过设置指定全局 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);