IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Newtonsoft.Json 与 System.Text.Json 序列化时如何省略空集合 -> 正文阅读

[开发工具]Newtonsoft.Json 与 System.Text.Json 序列化时如何省略空集合

最近项目中有一个比较特殊的需求,在返回给前端树形json数据时,将等于NULL和集合count等于0的设置为忽略序列化;由于返回数据中集合较多,一时间没有太好的方案,于是开始在递归方法中处理数据,将集合数据为空或集合为0的数据赋值为NULL,但是实践过程不是很理想,于是翻看一些资料。

首先,介绍一下Newtonsoft.Json:

方案一:

如果您正在寻找一种可以在不同类型中通用且不需要任何修改(属性等)的解决方案,那么我认为最好的解决方案是自定义DefaultContractResolver类。它将使用反射来确定IEnumerable给定类型的任何值是否为空,代码如下:

public class IgnoreEmptyEnumerablesResolver : DefaultContractResolver
{
    public static readonly IgnoreEmptyEnumerablesResolver Instance = new IgnoreEmptyEnumerablesResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);

        if (property.PropertyType != typeof(string) &&
            typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
        {
            property.ShouldSerialize = instance =>
            {
                IEnumerable enumerable = null;

                // this value could be in a public field or public property
                switch (member.MemberType)
                {
                    case MemberTypes.Property:
                        enumerable = instance
                            .GetType()
                            .GetProperty(member.Name)
                            .GetValue(instance, null) as IEnumerable;
                        break;
                    case MemberTypes.Field:
                        enumerable = instance
                            .GetType()
                            .GetField(member.Name)
                            .GetValue(instance) as IEnumerable;
                        break;
                    default:
                        break;

                }

                if (enumerable != null)
                {
                    // check to see if there is at least one item in the Enumerable
                    return enumerable.GetEnumerator().MoveNext();
                }
                else
                {
                    // if the list is null, we defer the decision to NullValueHandling
                    return true;
                }

            };
        }

        return property;
    }
}

您可以在您的框架的定制契约解析器中实现这个功能,此方案无需修改的你的代码,此方法相当于一些助手方法。

方案二:
如果您可以修改您的类,您可以添加封装方法并为所有空集合设置 NULL。它需要更改类,但它具有更好的性能。可能是您的另一种选择,代码如下:

  private List<JcLwtVM> lwtpChildren;

        [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
        public List<JcLwtVM> lwtChildren
        {
            get { return lwtpChildren; }
            set { lwtpChildren = value == null || value.Count <= 0 ? null : value; }
        }

最终我采用上面的方案二,修改我得VM实体类属性代码,目前在应用中没有出现问题。

其次,System.Text.Json:

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

封装有一个带有属性的对象:

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("hlfj")] public List<YjjcHlfjVM> HlfjList { get; set; }

在我测试中尝试使用以下命令序列化此对象时:

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

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

结果中仍然给我一个空数组:"HlfjList": [],难道没有方法或属性阻止它序列化这些空列表吗?我不希望看到HlfjList集合,因为前端也不希望看到,所以空集合根本不应该出现在json数据里。我需要怎么做呢?

经过一番比对查找代码后发现JsonIgnoreCondition.WhenWritingNull这个属性,于是修改代码再次尝试:

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

代码如下:

[JsonIgnore]
public List<YjjcHlfjVM> HlfjList { get; set; } = new();

[JsonPropertyName("HlfjList")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
 public List<YjjcHlfjVM> HlfjListExtensions
    {
        get => HlfjList?.Count > 0 ? HlfjList : null;
        set => HlfjList = value ?? new();
    }

至此,测试结束,希望对有用到的小伙伴们有帮助,如果您有更好的方案请留言给我。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:40:32  更:2022-05-05 11:42:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/19 18:31:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码