我正在使用JsonConvert.DeserializeObject(json.ToString()); 反序列化JSON并在相关模型中填充我的字段。这种方法很有效,直到JSON中缺少数据。基本上没有“key:value”我只会有“key:null”。
我对JsonConverter的理解是它会创建一个对象,在这个对象中我应该能够通过构造函数填充默认值的字段(在我的情况下不会因为未知原因而被调用),或者通过标签填充这里提到:Default value for missing properties with JSON.net或此处:Why when I deserialize with JSON.NET ignores my default value?
我已尝试过两者,但都没有导致相关字段被初始化。 当然,如果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"
以上在不依赖默认值时有效。
答案 0 :(得分:4)
您使用的是错误的设置。
如果您希望在反序列化期间忽略JSON中的null
值,则需要在设置中设置NullValueHandling = NullValueHandling.Ignore
。默认值为Include
,这意味着如果JSON中有特定属性的显式null
,则该属性将在您的对象上设置为null,覆盖您可能设置的任何默认值。 / p>
DefaultValueHandling.Populate
表示如果密钥在JSON中完全丢失(与设置为null不同),则它将使用[DefaultValue]
属性提供的值。请注意,如果JSON中包含明确的null
,则此设置将不使用属性中的默认值,即使NullValueHandling
设置为Ignore
也是如此。因此,如果您想在这种情况下使用默认值,最好的方法是在构造函数中设置它。
因此,简而言之,要获得您想要的行为:
NullValueHandling.Ignore
设置。DefaultValueHandling
设置或[DefaultValue]
属性。