【发布时间】:2021-08-14 23:32:30
【问题描述】:
我正在寻找一种通过名称查找特定 json 值并将其值设置为 null 的方法。 json文件的构造可以是任何东西,并不总是一样的。
假设 json 看起来像这样:
[
{
"id": "1111",
"email": "email@email.com",
},
{
"id": "2222",
"email": "email2@email2.com",
}]
我要找的结果是这样的:
[
{
"id": "1111",
"email": null,
},
{
"id": "2222",
"email": null,
}]
当对象更复杂时,它也应该可以工作。
{
"reservations": [
{
"id": "111",
"bookingId": "",
"status": "",
"checkInTime": "",
"checkOutTime": "",
"property": {
"id": "",
"code": "",
"name": "",
},
"primaryGuest": {
"firstName": "",
"middleInitial": "",
"lastName": "",
"email": "email@email.com",
"phone": "",
"address": {
"addressLine1": "",
"postalCode": "",
"city": "",
"countryCode": ""
}
},
"booker": {
"firstName": "",
"middleInitial": "",
"lastName": "",
"email": "email2@email.com",
"phone": ""
}
}]}
我尝试过使用 JArray、JObject 类等,但它只在propety["email"] 是第一个孩子而不是更深的情况下才有效。不知道如何做到这一点。
private JObject HashSensitiveData(JContainer jContainer)
{
if (!jContainer.Descendants().Any())
{
return null;
}
var objects = jContainer.Descendants().OfType<JObject>();
foreach (var property in objects)
{
foreach (var emailProperty in property.Properties().Where(x => x.Name.CaseInsensitiveContains(LoggerHashedProperties.Email.ToString())))
{
var email = emailProperty.Value.ToString();
property[emailProperty.Name] =null
}
}
return HashSensitiveData(jContainer);
}
【问题讨论】:
-
"json 文件的构造可以是任何东西,它并不总是一样的。"连结构都不知道怎么用?请贴出真实代码
-
结构不是恒定的,这意味着电子邮件节点可以嵌套。我正在使用它进行日志记录 - 我将收到的 api 请求响应记录为 json,并且需要将节点电子邮件的所有值设置为 null。