序列化到 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();
    }