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



我正在使用jsonconvert.deserializeObject(json.toString());在相关模型中填充我的字段,并填充我的领域。这效果很好,直到JSON中缺少数据为止。基本上,我不会拥有"键:值",我将拥有"键: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> 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<JsonModel>(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]属性提供的值。请注意,如果JSON中有明确的null,则即使将NullValueHandling设置为Ignore,此设置将不是使用默认值。因此,如果您希望在这种情况下默认值,那么最好的方法是将其设置在构造函数中。

因此,简而言之,要获得所需的行为:

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

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

相关内容

  • 没有找到相关文章

最新更新