我正在使用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> 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; }
}
}
Run Code Online (Sandbox Code Playgroud)
使用默认值创建JSON对象(默认设置无效)
JObject = JsonConvert.DeserializeObject<JsonModel>(json.ToString(), new
JsonSerializerSettings {DefaultValueHandling =
DefaultValueHandling.Populate});
Run Code Online (Sandbox Code Playgroud)
下游使用创建的对象的示例
JObject.actions[i].count + "more text"
Run Code Online (Sandbox Code Playgroud)
当不依赖默认值时,上述方法有效。
您使用了错误的设置。
如果要null在反序列化期间忽略JSON中的值,则需要在设置NullValueHandling = NullValueHandling.Ignore中进行设置。默认值为Include,这意味着,如果JSON中具有null针对特定属性的显式属性,则该属性将在您的对象上设置为null,从而覆盖您可能设置的任何默认值。
DefaultValueHandling.Populate表示如果键在JSON中完全丢失(与设置为null不同),则它将使用[DefaultValue]属性提供的值。请注意,如果JSON中包含显式内容null,则即使设置为,此设置也不会使用该属性的默认值。因此,如果您想在这种情况下使用默认值,最好的方法是在构造函数中进行设置。NullValueHandlingIgnore
因此,简而言之,要获得所需的行为:
NullValueHandling.Ignore设置。DefaultValueHandling设置或[DefaultValue]属性。演示小提琴:https : //dotnetfiddle.net/kyUjFz
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |