C# system.text.json在序列化时显式设置空属性,而忽略未设置的属性

C# system.text.json在序列化时显式设置空属性,而忽略未设置的属性,c#,serialization,null,system.text.json,null-object-pattern,C#,Serialization,Null,System.text.json,Null Object Pattern,我正在尝试将POCO对象序列化为更新请求 我的未设置值被序列化为null,这导致它们被更新为null 如果我将IgnoreNullValues设置为true,则可以修复问题。但是,没有办法显式地将属性更新为null 我认为解决这个问题的方法是创建一个定制的null对象,将其序列化为null并忽略真正的null值。这可能吗?我还能怎样解决这个问题 编辑:添加了我试图序列化的POCO请求对象的示例 internal class ContactCreateRequest { [JsonPrope

我正在尝试将POCO对象序列化为更新请求

我的未设置值被序列化为null,这导致它们被更新为null

如果我将IgnoreNullValues设置为true,则可以修复问题。但是,没有办法显式地将属性更新为null

我认为解决这个问题的方法是创建一个定制的null对象,将其序列化为null并忽略真正的null值。这可能吗?我还能怎样解决这个问题

编辑:添加了我试图序列化的POCO请求对象的示例

internal class ContactCreateRequest
{
   [JsonPropertyName("contact")]
   public ContactEntity Contact { get; set; }
}

internal class ContactEntity
{
    public string CompanyName { get; set; }
    public DateTime? CreateDateTime { get; set; }
    public string CreateId { get; set; }
    public string Department { get; set; }
    public string DisplayName { get; set; }
    public string FirstName { get; set; }
    public string GoesBy { get; set; }
    public string Id { get; set; }
    public string JobTitle { get; set; }
    public DateTime? LastEditDateTime { get; set; }
    public string LastEditId { get; set; }
    public string LastName { get; set; }
    public string ParentId { get; set; }
    public string Title { get; set; }
    public string UpdateAction { get; set; }
}
我想要以下的

var request = new ContactCreateRequest
{
   Contact = new ContactEntity
   {
      LastName = "Jane",
      JobTitle = null,
      UpdateAction = "Update"
   }
}

{"contact": {"LastName": "Jane", "JobTitle": null, "UpdateAction": "Update"}}

。。。但这当然行不通,因为所有未设置的字段也都是空的,所以它们被视为JobTitle。这就是为什么我想知道是否需要使用null对象模式来定义JobTitle应该显式设置为null。

编辑:由于dbc的注释非常恰当,我将null值更改为null\u null,以避免处理null姓氏时出现问题

您可以通过创建自定义JSON转换器、为字符串属性分配null值(而不是null)并使用IgnoreNullValues选项来实现您的目标。JSON序列化程序将忽略所有未初始化的值,自定义转换器将序列化null值,就像它是null一样。如果您希望为其他类型(如DateTime)提供类似的功能,则需要添加新的DateTime JsonConverter或创建一个更通用的JsonConverter,它可以处理所有可能的情况。也许,这不是一个完美的解决方案,但它是有效的

以下是转换器:

public class NullConverter : JsonConverter<string>
{
    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.GetString();
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        if (value == "null_null") writer.WriteNullValue();
        else writer.WriteStringValue(value);
    }
}

这是一个补丁REST请求吗?很遗憾,我正在使用一个外部api,它的行为非常糟糕。你能提供一个POCO示例吗?这将有助于使答案更直接相关。因此,要发送一个更新,将部门更改为Marketing,将标题设置为null,并且不影响其他内容,您需要发送{contact:{Department:Marketing,Title:null}}。。。是吗?@madreflection是的,API就是这样工作的谢谢。这就是我采取的方法。虽然不优雅,但确实做到了这一点。有关此方法的问题,请参阅和。
var request = new ContactCreateRequest()
{
    Contact = new ContactEntity
    {
        LastName = "Jane",
        JobTitle = "null_null",   // initializing to a "null_null" string instead of null
        UpdateAction = "Update"
     }
};

Console.WriteLine(JsonSerializer.Serialize(request, new JsonSerializerOptions() { 
                        Converters = { new NullConverter()}, 
                        IgnoreNullValues = true})
                  );