我正在尝试反序列化代表此类的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
那么它将是另一种方式。 [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
}
答案 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);