JSON.net,C#,无法在数据模型中设置默认值

我正在使用JsonConvert.DeserializeObject(json.ToString()); 反序列化JSON并在相关模型中填充我的字段。 这种方法很有效,直到JSON中缺少数据。 基本上没有“key:value”我只会有“key:null”。

我对JsonConverter的理解是它会创建一个对象,我应该能够通过构造函数填充默认值的字段(在我的情况下不会因为未知原因而调用),或者通过这里提到的标记: 使用JSON.net或此处缺少属性的默认值 : 为什么在使用JSON.NET反序列化时会忽略我的默认值?

我已尝试过两者,但都没有导致相关字段被初始化。 当然,如果JSON中没有数据,则无法对相关模型进行反序列化。 但是我希望我仍然可以使用默认值初始化一些值,然后JsonConverter会忽略(不会被覆盖)(就像现在发生的那样)。 然而,这似乎不可能?

以前尝试的源代码

模特课

namespace Project.MyJob { public class JsonModel { public JsonModel() { Type_X type_x = new Type_X(); // This is not doing anything. I would have expected that the // class' constructor would be called but, no. } public string objectNumber { get; set; } public string objectFamily { get; set; } public string objectOrder { get; set; } public string location { get; set; } public string place { get; set; } public string inventionTime { get; set; } public string lastUpdate { get; set; } public string condition { get; set; } public Type_X Type_X { get; set; } public List actions { get; set; } } public class Actions { public string count { get; set; } public string datetime { get; set; } public string place { get; set; } public string status { get; set; } } public class Type_X { public Type_X { // This should be executed when a new Type_X object is created? Also // not. partA = "null"; } [DefaultValue("null")] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public string partA { get; set; } // Trying public string partA { get; set; } = "null"; also does // nothing. [DefaultValue("null")] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public string PartB { get; set; } [DefaultValue("null")] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public string partC { get; set; } [DefaultValue("null")] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public string partD { get; set; } [DefaultValue("null")] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public string partE { get; set; } } } 

使用默认值创建JSON对象(默认值不起作用)

 JObject = JsonConvert.DeserializeObject(json.ToString(), new JsonSerializerSettings {DefaultValueHandling = DefaultValueHandling.Populate}); 

下游使用已创建对象的示例

 JObject.actions[i].count + "more text" 

以上工作时不依赖于默认值。

您使用的是错误的设置。

如果要在反序列化期间忽略JSON中的null值,则需要在设置中设置NullValueHandling = NullValueHandling.Ignore 。 默认值为Include ,这意味着如果JSON在特定属性中有明确的null ,则该属性将在您的对象上设置为null,覆盖您可能设置的任何默认值。

DefaultValueHandling.Populate表示如果密钥在JSON中完全丢失(不同于设置为null),则它将使用[DefaultValue]属性提供的[DefaultValue] 。 请注意,如果JSON中有明确的null ,则此设置将使用属性中的默认值,即使NullValueHandling设置为Ignore 。 因此,如果您想在这种情况下使用默认值,最好的方法是在构造函数中设置它。

所以,简而言之,要获得你想要的行为:

  • 使用NullValueHandling.Ignore设置。
  • 通过构造函数提供默认值。
  • 您不需要DefaultValueHandling设置或[DefaultValue]属性。

演示小提琴: https : //dotnetfiddle.net/kyUjFz