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 NonFlagStringEnumConverter : StringEnumConverter
public override bool CanConvert(Type objectType)
if (!base.CanConvert(objectType))
return !HasFlagsAttribute(objectType);
static bool HasFlagsAttribute(Type objectType)
return Attribute.IsDefined(Nullable.GetUnderlyingType(objectType) ?? objectType, typeof(System.FlagsAttribute));
public static void Main()
Test(UserCan.ChangeConf | UserCan.ForceOther);
Test(UserCan.ForceOther);
Test(UserCan.DoEverything);
Console.WriteLine("Uncaught exception:");
static void Test(UserCan ability)
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 GetNEWJsonSettings()
JsonSerializerSettings settings = new JsonSerializerSettings
DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate,
NullValueHandling = NullValueHandling.Ignore,
ObjectCreationHandling = ObjectCreationHandling.Replace,
TypeNameHandling = TypeNameHandling.Auto
settings.Converters.Add(new NonFlagStringEnumConverter { CamelCaseText = true });