我正在尝试对代表此类的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>))]
,它将崩溃。
quesiton :有没有办法使其适用于所有属性?
我想让它不要挂用,这样我就不必在代码的其他部分中检查它。
我尝试过的演示:
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);