using System.Globalization;
using Newtonsoft.Json.Linq;
public static void Main()
var input = JObject.Parse(@"
data: 'should NOT see this',
data: 'should be visible'
data: 'should NOT see this'
var output1 = JsonConvert.SerializeObject(input, Formatting.Indented, new RemoveEncryptedDataConverter());
var output2 = input.ToString(Formatting.Indented, new RemoveEncryptedDataConverter());
using (StringWriter stringWriter = new StringWriter((IFormatProvider)CultureInfo.InvariantCulture))
JsonTextWriter jsonTextWriter = new JsonTextWriter((TextWriter)stringWriter);
jsonTextWriter.Formatting = Formatting.Indented;
input.WriteTo(jsonTextWriter, new RemoveEncryptedDataConverter());
output3 = stringWriter.ToString();
Console.WriteLine("SerializeObject (CORRECT):");
Console.WriteLine(output1);
Console.WriteLine("ToString (INCORRECT):");
Console.WriteLine(output2);
Console.WriteLine("WriteTo (INCORRECT):");
Console.WriteLine(output3);
public class RemoveEncryptedDataConverter : JsonConverter
public override bool CanConvert(Type objectType)
return typeof(JToken).IsAssignableFrom(objectType);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
JToken token = (JToken)value;
if (token.Type == JTokenType.Object)
bool omitDataProperty = token.Value<string>("type") == "encrypted";
writer.WriteStartObject();
foreach (var prop in token.Children<JProperty>())
if (omitDataProperty && prop.Name == "data")
writer.WritePropertyName(prop.Name);
serializer.Serialize(writer, prop.Value);
else if (token.Type == JTokenType.Array)
writer.WriteStartArray();
foreach (var item in token.Children())
serializer.Serialize(writer, item);