using System.Collections.Generic;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
public static void Main()
""name"": ""Peter Gibbons"",
""company"": ""Initech"",
""password"": ""Sup3rS3cr3tP@ssw0rd!"",
""cardNumber"": ""1000200030004000"",
""expDate"": ""2017-10-18"",
""lastUse"": ""2016-10-15""
""vendor"": ""MasterCharge"",
""cardNumber"": ""1001200230034004"",
""expDate"": ""2018-05-21"",
""lastUse"": ""2016-10-02""
""accountType"": ""checking"",
""accountNumber"": ""12345678901"",
""financialInsitution"": ""1st Bank of USA"",
""routingNumber"": ""012345670""
""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);
public static string RemoveSensitiveProperties(string json, IEnumerable<Regex> regexes)
JToken token = JToken.Parse(json);
RemoveSensitiveProperties(token, regexes);
public static void RemoveSensitiveProperties(JToken token, IEnumerable<Regex> regexes)
if (token.Type == JTokenType.Object)
foreach (JProperty prop in token.Children<JProperty>().ToList())
foreach (Regex regex in regexes)
if (regex.IsMatch(prop.Name))
RemoveSensitiveProperties(prop.Value, regexes);
else if (token.Type == JTokenType.Array)
foreach (JToken child in token.Children())
RemoveSensitiveProperties(child, regexes);