我试图弄清楚如何序列化为json对象,并跳过序列化值为空列表的属性.I am not using 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; }

当我try 使用以下命令序列化此对象时

var optionsJson =   new JsonSerializerOptions
    {
    WriteIndented = true,
    IgnoreNullValues = true,
    PropertyNameCaseInsensitive = true,
    };

var json = JsonSerializer.Serialize(report, optionsJson);

它仍然给我一个空数组:

"extension": [],

难道没有办法阻止它序列化这些空列表吗?我想看到extension个消失.它根本不应该在那里.我需要这样做,因为如果我发送:

"extension": null,

序列化时,它不能是对象的一部分.

gateway error

我不想要这些空列表的原因是,我向对象发送的第三方网关需要空列表

"严重性":"错误",

我尽量避免在这上面做一些下流的字符串替换.

推荐答案

您可以添加一个伪属性,该属性在处理此问题的序列化过程中使用.

  • 添加一个具有相同签名的新属性,但用JsonPropertyNameAttribute标记它,以确保使用正确的名称对其进行序列化,并用JsonIgnoreAttribute进行序列化,以便在返回null时不会对其进行序列化.
  • 用JsonIgnore标记的原始属性是无条件的,这样它就永远不会被序列化
  • 当实际属性包含空列表时,该伪属性将返回null(因此将被忽略),否则它将返回该(非空)列表
  • 写入虚拟属性只是写入实际属性

比如:

[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相关问答推荐

带有PowerShell内核的NewtonSoft json.Net的奇怪行为

Vega Lite中的图例对齐

在Reaction中从JSON文件中筛选数组

如何在改装Android中将ResponseBody转换为JSONObject

有没有办法让serde_json正确/不正确地处理NaN、inf和-inf(IEEE 754特殊标准)?

Jolt-在数组列表中插入新的字段

Jolt:数组中两个字符串的连接

从包含 JSON 对象序列的文件中获取第一个 JSON 对象

如何强制仅有一个元素的数组在JSON中生成方括号

将boost::beast::multibuffer转换为std::istream

如何在 Apache NiFi 中使用 JoltTransformJson 删除流文件或具有空字段的整个对象?

使用 JQ 获取 JSON 中的替代元素(输出:JSON 对象)

使用 jolt 将对象数组转换为数组

JOLT - 如果对象内部存在键,则将对象移动到数组

将 JSON 解组为具有唯一元素的 map 切片

JQ 中的样本标准偏差

Servicestack 返回数组而不是带有数组的对象

在 React 中访问子级的父级状态

如何使用 Gson 解码具有未知字段的 JSON?

Volley JsonObjectRequest Post 参数不再起作用