using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class FJson : JsonConverter
bool Disabled { get { return disabled; } set { disabled = value; } }
public override bool CanWrite { get { return !Disabled; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
using (new PushValue<bool>(true, () => Disabled, (canWrite) => Disabled = canWrite))
t = JToken.FromObject(value, serializer);
if (t.Type != JTokenType.Object)
writer.WriteStartObject();
private void WriteJson(JsonWriter writer, JObject value)
foreach (var p in value.Properties())
WriteJson(writer, (JObject)p.Value);
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanConvert(Type objectType)
public struct PushValue<T> : IDisposable
public PushValue(T value, Func<T> getValue, Action<T> setValue)
if (getValue == null || setValue == null)
throw new ArgumentNullException();
this.setValue = setValue;
this.oldValue = getValue();
#region IDisposable Members
[JsonConverter(typeof(FJson))]
public int id { get; set; }
public string name { get; set; }
[JsonConverter(typeof(BConverter))]
public string name { get; set; }
public class BConverter : JsonConverter
bool Disabled { get { return disabled; } set { disabled = value; } }
public override bool CanWrite { get { return !Disabled; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
using (new PushValue<bool>(true, () => Disabled, (canWrite) => Disabled = canWrite))
t = JToken.FromObject(value, serializer);
obj["BConverterCalled"] = true;
public override bool CanConvert(Type objectType)
throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public static void Test()
var jsonFormatted = JsonConvert.SerializeObject(a, Formatting.Indented);
Console.WriteLine(jsonFormatted);
var json = JsonConvert.SerializeObject(a, Formatting.None);
Assert.IsTrue(json == "{\"id\":1,\"name\":null,\"name\":\"value\",\"BConverterCalled\":true}");
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");