使用 lambda 表达式将 JSON 字段设置为 null

Posted

技术标签:

【中文标题】使用 lambda 表达式将 JSON 字段设置为 null【英文标题】:Setting JSON field to null using lambda expression 【发布时间】:2021-12-28 10:36:01 【问题描述】:

我有一个如下所示的 JSON:

"items": [
        "something": "",
        "something_2": "",
        "field_of_interest": 
          "blah": [
            
              "placeholder": "1",
              "category": "random"
            ,
            
              "placeholder": "2",
              "category": "random",
              "field_to_null": 
                "something_here": "",
              
            
          ]
        
      ]

我正在尝试将“field_to_null”字段设置为空。这些 JSON 字段都封装在对象中,我的表达式如下所示:

 Items.Select(x => x.FieldOfInterest)
       .Select(y => y.Blah
       .Select(z => z.FieldToNull).ToList().ForEach(a => a = null));

但我在第二个.Select 上遇到错误。发现错误here。 ItemsItems 对象的列表,BlahFieldOfInterest 对象的列表。我对 C# 和编写 lambda linq 表达式还很陌生,因此不胜感激。

【问题讨论】:

首先,Linq 真正用于查询(因此是 Q)而不是用于改变对象。我个人讨厌ForEach 扩展。其次,您给了我们 JSON,但我们不知道 C# 类是什么。什么是items @DavidG 我同意,但我正在使用此代码编写测试,如果我可以将字段设置为 null 并对其运行测试会很方便。 ItemsItems 对象的列表,BlahFieldOfInterest 对象的列表。 【参考方案1】:

Linq 的一般哲学是不改变事物,这就解释了为什么 ForEach 不是 Linq 扩展方法,而是某些集合类型上的方法,例如 List

通常尽量避免在 Linq 运算符中使用不纯的 lambda。

尽管如此,您仍然可以使用 Linq 进行突变,通过投影,使用 Select 运算符,并传递一个将返回突变参数的 lambda。 结果如下。

Items
    .Select(i => 
    
        i.FieldOfInterest.Blah = i.FieldOfInterest.Blah
            .Select(bi => 
            
                bi.field_to_null = null;
                return bi;
            )
            .ToList() // Transform to the needed collection type
        return i;
    );

这相当于:

foreach(var i in Items)

    foreach(var bi in i.field_of_interest.Blah)
    
        bi.field_to_null = null;
    

Non-Linq 方法显然更具可读性。

【讨论】:

以上是关于使用 lambda 表达式将 JSON 字段设置为 null的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

lambda表达式中如何在group by 后将查询出的字段象sql一样使用as定义一个名 比如select a as C from b

使用springboot时如何创建JsonDeserializer,将null设置为JSON中等于“”的所有Java对象字段?

使用lambda表达式按字段排序

Lambda表达式中 select 怎么动态添加查询字段

android studio设置支持lambda表达式