【发布时间】:2018-06-03 21:50:40
【问题描述】:
我正在使用 JsonConvert.DeserializeObject(json.ToString()); 反序列化 JSON 并在相关模型中填充我的字段。在 JSON 中缺少数据之前,这很有效。基本上,我将只有“key:null”,而不是“key:value”。
我对 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"
当不依赖默认值时,上述方法有效。
【问题讨论】:
-
您说您的 JSON 中有 "key": null 。这与根本不存在真的不同。 null 是一个有效值,因此它被分配。我会说默认值只有在 JSON 中完全丢失密钥的情况下才会生效。以及为什么你认为构造函数没有被调用。你在那里设置断点了吗?
-
从@Daniel 所说的开始,
JsonSerializerSettings有一个NullValueHandling属性。 -
啊,有趣的见解。我将尝试从我的 json 中删除这个尾随数据集,看看会发生什么。