使用 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。 Items
是 Items
对象的列表,Blah
是 FieldOfInterest
对象的列表。我对 C# 和编写 lambda linq 表达式还很陌生,因此不胜感激。
【问题讨论】:
首先,Linq 真正用于查询(因此是 Q)而不是用于改变对象。我个人讨厌ForEach
扩展。其次,您给了我们 JSON,但我们不知道 C# 类是什么。什么是items
?
@DavidG 我同意,但我正在使用此代码编写测试,如果我可以将字段设置为 null 并对其运行测试会很方便。 Items
是 Items
对象的列表,Blah
是 FieldOfInterest
对象的列表。
【参考方案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对象字段?