首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在序列化到json时忽略空列表?

如何在序列化到json时忽略空列表?
EN

Stack Overflow用户
提问于 2022-03-09 12:41:49
回答 1查看 2.2K关注 0票数 7

我试图弄清楚如何序列化到json对象,并跳过值为空列表的序列化属性。我不使用Newtonsoft json

代码语言:javascript
运行
复制
using System.Text.Json;
using System.Text.Json.Serialization;
using AutoMapper;

我有一个有财产的对象。

代码语言:javascript
运行
复制
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("extension")]
public List<Extension> Extension { get; set; }

当我尝试使用以下方法序列化此对象时

代码语言:javascript
运行
复制
var optionsJson =   new JsonSerializerOptions
    {
    WriteIndented = true,
    IgnoreNullValues = true,
    PropertyNameCaseInsensitive = true,
    };

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

它仍然给了我一个空数组:

代码语言:javascript
运行
复制
"extension": [],

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

代码语言:javascript
运行
复制
"extension": null,

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

网关错误

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

“严重性”:“错误”、“代码”:“处理”、“诊断”:“数组不能为空--如果没有值,属性就不应该存在”、“位置”:[ "Bundle.entry2.resource.extension“、”第96行、Col 23“]

我试着避免在这上面做一些讨厌的字符串替换。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-09 13:16:33

您可以添加一个在序列化期间使用的虚拟属性来处理这个问题。

  • 添加了一个具有相同签名的新属性,但是用JsonPropertyNameAttribute标记它以确保它被用正确的名称序列化,也用JsonIgnoreAttribute标记,这样它在返回null时不会被序列化。

无条件地将您用JsonIgnore标记的原始属性

  • 起来,这样当实际的属性包含一个空列表时,它就永远不会被序列化--这个虚拟属性将返回null (从而被忽略),否则它将返回(非空)列表H 29H 110写入虚拟属性,只是写到实际属性H 211f 212。

就像这样:

代码语言:javascript
运行
复制
[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();
    }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71409542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档