当前位置: 首页 > 面试题库 >

使用Json.Net从JSON动态删除字段

查飞星
2023-03-14
问题内容

我有一些JSON输入,其形状我无法预测,并且我必须进行一些转换(以称呼它),以便不记录某些字段。例如,如果我有此JSON:

{
    "id": 5,
    "name": "Peter",
    "password": "some pwd"
}

然后,在转换之后,它应如下所示:

{
    "id": 5,
    "name": "Peter"
}

上面的示例是微不足道的,但实际情况并非如此。我将有一些正则表达式,如果 输入JSON
上的任何字段与之匹配,则不应将其放在结果上。如果我有一些嵌套对象,我将必须递归进行。我一直在 LINQ to JSON
上看到过一些东西,但找不到满足我需求的东西。

有办法吗?

注意
:这是日志记录库的一部分。如果有必要或更简单,我可以使用JSON字符串。问题是,在日志记录管道的某个时刻,我得到了对象(或所需的字符串),然后需要从中剥离敏感数据,例如
密码 ,以及其他任何客户端指定的数据。


问题答案:

您可以将JSON解析JToken,然后使用递归帮助器方法将属性名称与正则表达式进行匹配。只要有匹配项,就可以从其父对象中删除该属性。删除所有敏感信息后,只需使用JToken.ToString()即可获取已编辑的JSON。

这是辅助方法的外观:

public static string RemoveSensitiveProperties(string json, IEnumerable<Regex> regexes)
{
    JToken token = JToken.Parse(json);
    RemoveSensitiveProperties(token, regexes);
    return token.ToString();
}

public static void RemoveSensitiveProperties(JToken token, IEnumerable<Regex> regexes)
{
    if (token.Type == JTokenType.Object)
    {
        foreach (JProperty prop in token.Children<JProperty>().ToList())
        {
            bool removed = false;
            foreach (Regex regex in regexes)
            {
                if (regex.IsMatch(prop.Name))
                {
                    prop.Remove();
                    removed = true;
                    break;
                }
            }
            if (!removed)
            {
                RemoveSensitiveProperties(prop.Value, regexes);
            }
        }
    }
    else if (token.Type == JTokenType.Array)
    {
        foreach (JToken child in token.Children())
        {
            RemoveSensitiveProperties(child, regexes);
        }
    }
}

这是其用法的简短演示:

public static void Test()
{
    string json = @"
    {
      ""users"": [
        {
          ""id"": 5,
          ""name"": ""Peter Gibbons"",
          ""company"": ""Initech"",
          ""login"": ""pgibbons"",
          ""password"": ""Sup3rS3cr3tP@ssw0rd!"",
          ""financialDetails"": {
            ""creditCards"": [
              {
                ""vendor"": ""Viza"",
                ""cardNumber"": ""1000200030004000"",
                ""expDate"": ""2017-10-18"",
                ""securityCode"": 123,
                ""lastUse"": ""2016-10-15""
              },
              {
                ""vendor"": ""MasterCharge"",
                ""cardNumber"": ""1001200230034004"",
                ""expDate"": ""2018-05-21"",
                ""securityCode"": 789,
                ""lastUse"": ""2016-10-02""
              }
            ],
            ""bankAccounts"": [
              {
                ""accountType"": ""checking"",
                ""accountNumber"": ""12345678901"",
                ""financialInsitution"": ""1st Bank of USA"",
                ""routingNumber"": ""012345670""
              }
            ]
          },
          ""securityAnswers"":
          [
              ""Constantinople"",
              ""Goldfinkle"",
              ""Poppykosh"",
          ],
          ""interests"": ""Computer security, numbers and passwords""
        }
      ]
    }";

    Regex[] regexes = new Regex[]
    {
        new Regex("^.*password.*$", RegexOptions.IgnoreCase),
        new Regex("^.*number$", RegexOptions.IgnoreCase),
        new Regex("^expDate$", RegexOptions.IgnoreCase),
        new Regex("^security.*$", RegexOptions.IgnoreCase),
    };

    string redactedJson = RemoveSensitiveProperties(json, regexes);
    Console.WriteLine(redactedJson);
}

这是结果输出:

{
  "users": [
    {
      "id": 5,
      "name": "Peter Gibbons",
      "company": "Initech",
      "login": "pgibbons",
      "financialDetails": {
        "creditCards": [
          {
            "vendor": "Viza",
            "lastUse": "2016-10-15"
          },
          {
            "vendor": "MasterCharge",
            "lastUse": "2016-10-02"
          }
        ],
        "bankAccounts": [
          {
            "accountType": "checking",
            "financialInsitution": "1st Bank of USA"
          }
        ]
      },
      "interests": "Computer security, numbers and passwords"
    }
  ]
}

小提琴:https :
//dotnetfiddle.net/KcSuDt



 类似资料:
  • 问题内容: 我有以下格式的json响应。 我相信json.net可以处理转义字符,因此我使用了以下代码将其反序列化为字典集合。 但是,此json解析引发异常“无效的属性标识符字符:。路径’[0]’,第1行,位置2”。我们可以通过处理json响应字符串来解决此问题吗? 问题答案: 在反序列化过程之前尝试。

  • 围绕这个话题有相当多的讨论 ViewPager PagerAdapter未更新视图 动态更新ViewPager? 从FragmentStatePagerAdapter删除片段 结果是 要么我得到一个空白页(意味着片段已销毁,但未调用)进行替换) 或者整个系统崩溃,可能是因为Android管理碎片实例的方式与我在中保存它们的方式不匹配 这是我的适配器 谢谢!

  • 问题内容: 我正在尝试将一些JSON数据反序列化为应用程序的对象。到现在为止还不错,因为JSON数据上的属性是静态的(带有值的键)。现在,我得到了一个结果,其中的关键是动态数据。 这是一个示例JSON网址: http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info 由此产生的JSON是: 好的

  • DELETE /feeds/:feed/currency Response Status: 204 No Content

  • 问题内容: 我在C#中有一个类似以下的字符串。我需要遍历并创建HTML表输出。我尝试使用JSON.NET,但无法弄清楚如何检索键(名称,年龄和工作)。 表格格式为 任何帮助将不胜感激。 Dave提供的代码在这里是理想的解决方案..但是它适用于.NET 4.0 ..我已经将JSON.NET和以下代码用于.NET 3.5 使用Newtonsoft.Json.Linq; 问题答案: 您可以使用.NET

  • 问题内容: 我想使用gson删除具有空集合或空值的属性。 我打印json,我有这个: 例如,对于该json,我不想拥有集合aiAvisos,有一种方法可以将其从json中删除。我实际上正在处理很多集合,在这里我展示了一个集合,我确实需要从json中删除它们。 我需要这样的东西: 我尝试将集合设置为null,我检查了文档,也没有方法… 请任何建议。 非常感谢阅读本文的人! 问题答案: 遵循的步骤: