C# system.text.json在序列化时显式设置空属性,而忽略未设置的属性
我正在尝试将POCO对象序列化为更新请求 我的未设置值被序列化为null,这导致它们被更新为null 如果我将IgnoreNullValues设置为true,则可以修复问题。但是,没有办法显式地将属性更新为null 我认为解决这个问题的方法是创建一个定制的null对象,将其序列化为null并忽略真正的null值。这可能吗?我还能怎样解决这个问题 编辑:添加了我试图序列化的POCO请求对象的示例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
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})
);