在 Newtonsoft.JSON 中序列化空对象而不是 null

Serialize empty object instead of null in Newtonsoft.JSON

这困扰了我一段时间。我有型号:

public class Main
{
    public Header header { get; set; }
    public Response response { get; set; }
}

public class Response
{
    public string projectId { get; set; }
    public string designBriefId { get; set; }
    public MDT mdt { get; set; }
    public List<ReferenceMDT> referenceMDT { get; set; }
    public List<ProductList> ProductList { get; set; }

}
public class MDT
{
    [Key]
    public string mdtAssetId { get; set; }
    public bool isMDTDownloaded { get; set; }
    public bool isNamingConventionCorrect { get; set; }
}

每当我将此对象序列化为 JSON 使用:

Newtonsoft.Json

然后我变得无效(来自我正在处理的 API POV)JSON empty/null 对象上的转换:

{
  "header": "unimportant",
  "response": {
    "projectId": "Prj_02022022_2",
    "designBriefId": "DB_02022022_4",
    "mdt": null,
    "referenceMDT": [],
    "ProductList": []
  }
}

重点是我要序列化输出:

"mdt": {}

而不是:

"mdt": null

所以问题是我如何“标记”此值以序列化为空对象而不是空对象,或者如何将其转换为空对象? 正如我所提到的,它困扰了我一段时间,我不确定如何解决这个问题。我试图改变整个问题并将其更改为

忽略
JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}

但问题是 API 的另一端必须接收空对象,null 或缺少对象将被视为错误。

正如您在 MDT 模型中看到的那样,主要是 bool 属性,因此每当我将对象生成为 new() 并忽略空值时,它会用 false 填充所有 bool,从而生成一个也被认为是错误的对象:

"mdt": {
  "mdtAssetId": null,
  "isMDTDownloaded": false,
  "isNamingConventionCorrect": false,
  "isFolderStructureProvidedByAgencyCorrect": false,
  "heroImageGuidelinesAvailable": false,
  "allImagesAvailable": false,
  "isDesignTargetLocked": false,
  "isPackagingGuidelinesAvailable": false,
  "isRegulatoryGuidelinesAvailable": false,
  "mdtResponse": null,
  "pmaCommentsforMDT": null
}

我将非常感谢任何帮助甚至信息,这是不可能的,但如果空对象和 null 对象之间存在差异,我认为它是可以解析的,但我太笨了,无法弄清楚。

TL;DR: I've got object and whenever I'm trying to serialize it to JSON, it's either returning me null, or object with bool values filled as "false", which both are error and I need empty object generated.

为了避免错误,只需将 bool 更改为 bool?

public class MDT
{
    [Key]
    public string mdtAssetId { get; set; }
    public bool? isMDTDownloaded { get; set; }
    public bool? isNamingConventionCorrect { get; set; }
}