using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
""Password"": ""Password""
""number"": ""4111111111111""
JToken token = JToken.Parse(json);
string[] jsonPaths = ExampleConfigSettings.GetJsonPathsToObscure();
JsonHelper.ObscureMatchingValues(token, jsonPaths);
ExampleLogger.Log(token.ToString(Formatting.None));
public static class JsonHelper
public static void ObscureMatchingValues(JToken token, IEnumerable<string> jsonPaths)
foreach (string path in jsonPaths)
foreach (JToken match in token.SelectTokens(path))
match.Replace(new JValue(Obscure(match.ToString())));
public static string Obscure(string s)
if (string.IsNullOrEmpty(s)) return s;
int leftLen = len > 4 ? 1 : 0;
int rightLen = len > 6 ? Math.Min((len - 6) / 2, 4) : 0;
return s.Substring(0, leftLen) +
new string('*', len - leftLen - rightLen) +
s.Substring(len - rightLen);
public static class ExampleConfigSettings
public static string[] GetJsonPathsToObscure()
return new string[] { "$..Password", "$..credit_card.number" };
public static class ExampleLogger
public static void Log(string s)
Console.WriteLine(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - " + s);