首页 > 编程语言 >C# 去除JSON的空节点

C# 去除JSON的空节点

时间:2024-07-05 16:57:38浏览次数:11  
标签:C# JTokenType token JToken item JSON propValue Type 节点

方法一:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;

JObject testJson = new JObject()
{
    { "code", "1234560" },
    { "app", null }
};
testJson.DescendantsAndSelf()
        .OfType<JProperty>()
        .Where(p => p.Value.Type == JTokenType.Null || p.Value.ToString() == "")
        .ToList()
        .ForEach(p => p.Remove());

方法二:

直接调用方法即可

private static void RemoveEmptyValues(JToken token)
{
    if (token is JValue)
    {
        if (token.Type == JTokenType.Null || (token.Type == JTokenType.String && token.ToString() == ""))
        {
            token.Parent.Remove();
        }
    }
    else if (token is JContainer)
    {
        foreach (JToken child in token.Children().ToList())
        {
            RemoveEmptyValues(child);
        }

        if (!token.HasValues)
        {
            token.Parent.Remove();
        }
    }
}

方法三:

直接调用方法即可

public static JToken RemoveEmptyValues(JToken token)
{
    if (token.Type == JTokenType.Object)
    {
        JObject obj = (JObject)token;
        List<string> keysToRemove = new List<string>();
        foreach (JProperty prop in obj.Properties())
        {
            JToken propValue = RemoveEmptyValues(prop.Value);
            if (propValue.Type == JTokenType.Null ||
                propValue.Type == JTokenType.String && ((string)propValue).Trim() == "" ||
                propValue.Type == JTokenType.Array && !propValue.HasValues ||
                propValue.Type == JTokenType.Object && !((JObject)propValue).HasValues)
            {
                keysToRemove.Add(prop.Name);
            }
            else
            {
                prop.Value = propValue;
            }
        }

        foreach (string key in keysToRemove)
        {
            obj.Remove(key);
        }

        return obj;
    }
    else if (token.Type == JTokenType.Array)
    {
        JArray arr = (JArray)token;
        List<JToken> itemsToRemove = new List<JToken>();
        for (int i = 0; i < arr.Count; i++)
        {
            JToken item = RemoveEmptyValues(arr[i]);
            if (item.Type == JTokenType.Null ||
                item.Type == JTokenType.String && ((string)item).Trim() == "" ||
                item.Type == JTokenType.Array && !item.HasValues ||
                item.Type == JTokenType.Object && !((JObject)item).HasValues)
            {
                itemsToRemove.Add(arr[i]);
            }
            else
            {
                arr[i] = item;
            }
        }

        foreach (JToken item in itemsToRemove)
        {
            arr.Remove(item);
            //item.RemoveFromLowestPossibleParent();
        }

        return arr;
    }

    // 对于其他类型的JToken(如原始值),直接返回原始token
    return token;
}

方法四:

仅针对于有对应实体类的JSON序列化

public class Person
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

static void Main(string[] args)
{
  Person person = new Person()
  {
      Name = "Test",
      Age = null
  };
  var setting = new JsonSerializerSettings
  {
      NullValueHandling = NullValueHandling.Ignore
  };
  string str = JsonConvert.SerializeObject(person, setting); 
}

标签:C#,JTokenType,token,JToken,item,JSON,propValue,Type,节点
From: https://www.cnblogs.com/waou/p/18286158

相关文章

  • Codeforces Round 953 (Div. 2)
    CodeforcesRound953(Div.2)闲来无事水题解。A。B。C显然\(k\)是偶数。考虑\(k\)的上界,\(p_{1}=n,p_{n}=1\),产生\(2n-2\)的贡献,同时递归到子问题。那么等价于有\(1\simn-1\)的物品可以有贡献,可以直接贪心构造。D好像做复杂了。\(i\)能赢有两种情况:没......
  • 四种封装 ThreadPoolExecutor 的线程池的使用以及直接使用 ThreadPoolExecutor ,优缺点
    池化思想:线程池、字符串常量池、数据库连接池提高资源的利用率下面是手动创建线程和执行任务过程,可见挺麻烦的,而且线程利用率不高。手动创建线程对象执行任务执行完毕,释放线程对象线程池的优点:提高线程的利用率提高程序的响应速度便于统一管理线程对象可以控制最大并发......
  • C++ 类型转换注意事项总结
    在C++中,类型转换是编程过程中不可避免的一部分,但不当的类型转换可能会导致程序错误、数据损坏甚至程序崩溃。因此,了解类型转换的注意事项至关重要。以下是C++类型转换时需要注意的几个方面:1.区分隐式类型转换和显式类型转换隐式类型转换:由编译器自动完成,无需程序员干预。......
  • SpringCloud Alibaba Nacos 配置动态更新源码学习总结(二)
    书接上回SpringCloudAlibabaNacos配置动态更新源码学习总结主要看了SpringCloudAlibabNacos的动态配置原理,依赖于部分的springcloud的组件,比如org.springframework.cloud.bootstrap.BootstrapConfiguration,在启动之前进行干预项目启动,那么在之前springboot项目怎么实现的......
  • ToDesk云电脑开启公测!支持AIGC、高性能渲染等场景,价格低至0.98元
    在云计算和人工智能技术飞速发展的今天,云电脑作为一种新型的计算模式,正逐渐改变着传统电脑的使用方式。近日,ToDesk云电脑宣布开启公测,以其支持AIGC(人工智能、大数据、云计算等技术的融合应用)、高性能配置等特性,引起广大用户的热烈关注。为了应对日益增长的远程办公和灵活工作需......
  • Vue 与 scoped
    在Vue中,scoped是一个用于<style>标签的特殊属性,它的作用是将样式限定在当前组件的范围内,避免样式污染其他组件。这对于大型项目尤其有用,因为它可以确保组件的样式是独立的,不会意外地影响到其他组件。使用scoped在Vue组件中,你可以通过在<style>标签上添加scoped属性......
  • 解决nacos报错 Caused by: io.grpc.netty.shaded.io.netty.channel.unix.Errors$Nati
    报错信息:org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)atorg......
  • ComfyUI进阶篇:ComfyUI核心节点(一)
    ComfyUI进阶篇:ComfyUI核心节点(一)前言:学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每个......
  • Collection接口和常用方法
    Collection接口实现类的特点publicinterfaceCollection<E>extendsIterable<E>collection实现子类可以存放多个子元素,每个元素可以是Object有些Collection的实现类,可以存放时能够重复的元素,有些不行有些Collection的实现类是有序的(List),有些不是(Set)Collection接口没有直接......
  • Centos 7 离线安装docker及docker-compose
    一、docker安装下载docker安装包地址:https://download.docker.com/linux/static/stable/x86_64/选择需要用到的版本进行下载百度网盘docker-26.1.4.tgz安装包地址:https://pan.baidu.com/s/1mdCjdQnI_aFQ2CgGl7ILEA提取码:7h4d上传服务器并解压tar-zxvfdocker-26.......