序列化到 json 时如何忽略空列表?
How to ignore empty list when serializing to json?
我正在尝试弄清楚如何序列化为 json 对象并跳过序列化值为空列表的属性。 我没有使用 Newtonsoft json
using System.Text.Json;
using System.Text.Json.Serialization;
using AutoMapper;
我有一个 属性 的对象。
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("extension")]
public List<Extension> Extension { get; set; }
当我尝试使用以下方法序列化此对象时
var optionsJson = new JsonSerializerOptions
{
WriteIndented = true,
IgnoreNullValues = true,
PropertyNameCaseInsensitive = true,
};
var json = JsonSerializer.Serialize(report, optionsJson);
它仍然给我一个空数组:
"extension": [],
有没有办法阻止它序列化这些空列表?我希望看到 extension
消失。它根本不应该在那里。我需要这样做,因为如果我发送:
,网关将响应错误
"extension": null,
序列化时不能是对象的一部分。
网关错误
我不想要这些空列表的原因是我将对象发送到空列表的第三方网关
"severity": "error",
"code": "processing",
"diagnostics": "Array cannot be empty - the property should not be present if it has no values",
"location": [ "Bundle.entry[2].resource.extension", "Line 96, Col 23" ]
我试图避免对此进行某种讨厌的字符串替换。
您可以添加一个在序列化过程中使用的虚拟 属性 来处理此问题。
- 添加一个具有相同签名的新 属性,但用
JsonPropertyNameAttribute
标记它以确保它使用正确的名称进行序列化,并使用 JsonIgnoreAttribute
以便它当它 return 为空时将不会被序列化。
- 原来属性你用JsonIgnore标记,无条件,这样就永远不会自己序列化了
- 当实际 属性 包含一个空列表时,这个虚拟 属性 会 return
null
(因此被忽略),否则它会 return那个 (non-empty) 列表
- 写入虚拟 属性 只是写入实际 属性
像这样:
[JsonIgnore]
public List<Extension> Extensions { get; set; } = new();
[JsonPropertyName("extension")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<Extension> SerializationExtensions
{
get => Extensions?.Count > 0 ? Extensions : null;
set => Extensions = value ?? new();
}
我正在尝试弄清楚如何序列化为 json 对象并跳过序列化值为空列表的属性。 我没有使用 Newtonsoft json
using System.Text.Json;
using System.Text.Json.Serialization;
using AutoMapper;
我有一个 属性 的对象。
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("extension")]
public List<Extension> Extension { get; set; }
当我尝试使用以下方法序列化此对象时
var optionsJson = new JsonSerializerOptions
{
WriteIndented = true,
IgnoreNullValues = true,
PropertyNameCaseInsensitive = true,
};
var json = JsonSerializer.Serialize(report, optionsJson);
它仍然给我一个空数组:
"extension": [],
有没有办法阻止它序列化这些空列表?我希望看到 extension
消失。它根本不应该在那里。我需要这样做,因为如果我发送:
"extension": null,
序列化时不能是对象的一部分。
网关错误
我不想要这些空列表的原因是我将对象发送到空列表的第三方网关
"severity": "error", "code": "processing", "diagnostics": "Array cannot be empty - the property should not be present if it has no values", "location": [ "Bundle.entry[2].resource.extension", "Line 96, Col 23" ]
我试图避免对此进行某种讨厌的字符串替换。
您可以添加一个在序列化过程中使用的虚拟 属性 来处理此问题。
- 添加一个具有相同签名的新 属性,但用
JsonPropertyNameAttribute
标记它以确保它使用正确的名称进行序列化,并使用JsonIgnoreAttribute
以便它当它 return 为空时将不会被序列化。 - 原来属性你用JsonIgnore标记,无条件,这样就永远不会自己序列化了
- 当实际 属性 包含一个空列表时,这个虚拟 属性 会 return
null
(因此被忽略),否则它会 return那个 (non-empty) 列表 - 写入虚拟 属性 只是写入实际 属性
像这样:
[JsonIgnore]
public List<Extension> Extensions { get; set; } = new();
[JsonPropertyName("extension")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<Extension> SerializationExtensions
{
get => Extensions?.Count > 0 ? Extensions : null;
set => Extensions = value ?? new();
}