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 ForceNumericFlagEnumConverter : JsonConverter
public override bool CanConvert(Type objectType)
if (!(Nullable.GetUnderlyingType(objectType) ?? objectType).IsEnum)
return HasFlagsAttribute(objectType);
public override bool CanRead { get { return false; } }
public override bool CanWrite { get { return false; } }
static bool HasFlagsAttribute(Type objectType)
return Attribute.IsDefined(Nullable.GetUnderlyingType(objectType) ?? objectType, typeof(System.FlagsAttribute));
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)
throw new NotImplementedException();
public static void Main()
Test(UserCan.ChangeConf | UserCan.ForceOther);
Test(UserCan.ForceOther);
Test(UserCan.DoEverything);
Console.WriteLine("Uncaught exception:");
static void Test(UserCan ability)
JsonConvert.DefaultSettings = () => GetGlobalJsonSettings();
var settings = GetNEWJsonSettings();
string jsonAbility = JsonConvert.SerializeObject(ability, settings);
Console.WriteLine("\nJSON serialization for {0} \"{1}\":", ability.GetType(), ability);
Console.WriteLine(jsonAbility);
Assert.IsTrue(long.TryParse(jsonAbility, out val));
var result1 = JsonConvert.DeserializeObject<UserCan?>(jsonAbility, settings);
var result2 = JsonConvert.DeserializeObject<UserCan>(jsonAbility, settings);
Assert.IsTrue(result1 == ability);
Assert.IsTrue(result2 == ability);
Assert.AreEqual("\"someValue\"", JsonConvert.SerializeObject(NonFlagEnum.SomeValue, settings));
public enum UserCan : long
EditRemoveOthers = 1 << 3,
DoEverything = long.MaxValue,
public static JsonSerializerSettings GetGlobalJsonSettings()
JsonSerializerSettings settings = new JsonSerializerSettings
Converters = { new StringEnumConverter{ CamelCaseText = true } },
public static JsonSerializerSettings GetNEWJsonSettings()
JsonSerializerSettings settings = new JsonSerializerSettings
DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate,
NullValueHandling = NullValueHandling.Ignore,
ObjectCreationHandling = ObjectCreationHandling.Replace,
TypeNameHandling = TypeNameHandling.Auto,
Converters = { new ForceNumericFlagEnumConverter() },