{"record":{"id":"b132b0ead08da0c3","repo":"JamesNK/Newtonsoft.Json","slug":"enum-name-0-already-exists-on-enum-1","errorCode":null,"errorMessage":"Enum name '{0}' already exists on enum '{1}'.","messagePattern":"Enum name '(.+?)' already exists on enum '(.+?)'\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Src/Newtonsoft.Json/Utilities/EnumUtils.cs","lineNumber":77,"sourceCode":"\n            for (int i = 0; i < names.Length; i++)\n            {\n                string name = names[i];\n                FieldInfo f = enumType.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;\n                values[i] = ToUInt64(f.GetValue(null)!);\n\n                string resolvedName;\n#if HAVE_DATA_CONTRACTS\n                string? specifiedName = f.GetCustomAttributes(typeof(EnumMemberAttribute), true)\n                         .Cast<EnumMemberAttribute>()\n                         .Select(a => a.Value)\n                         .SingleOrDefault();\n                hasSpecifiedName = specifiedName != null;\n                resolvedName = specifiedName ?? name;\n\n                if (Array.IndexOf(resolvedNames, resolvedName, 0, i) != -1)\n                {\n                    throw new InvalidOperationException(\"Enum name '{0}' already exists on enum '{1}'.\".FormatWith(CultureInfo.InvariantCulture, resolvedName, enumType.Name));\n                }\n#else\n                resolvedName = name;\n                hasSpecifiedName = false;\n#endif\n\n                resolvedNames[i] = key.Value2 != null\n                    ? key.Value2.GetPropertyName(resolvedName, hasSpecifiedName)\n                    : resolvedName;\n            }\n\n            bool isFlags = enumType.IsDefined(typeof(FlagsAttribute), false);\n\n            return new EnumInfo(isFlags, values, names, resolvedNames);\n        }\n\n        public static IList<T> GetFlagsValues<T>(T value) where T : struct\n        {","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/JamesNK/Newtonsoft.Json/blob/4f73e74372445108d2c1bda37b36e6f5e43402e0/Src/Newtonsoft.Json/Utilities/EnumUtils.cs#L59-L95","documentation":"InitializeValuesAndNames (EnumUtils.cs:52-92) builds the EnumInfo by computing each member's resolved name (from [EnumMember(Value=...)] then the NamingStrategy). It checks for duplicates at EnumUtils.cs:75-78: if an already-seen resolved name collides with the current one, it throws InvalidOperationException naming both the duplicate name and the enum.","triggerScenarios":"Two enum members resolve to the same serialized name — either via identical [EnumMember(Value=\"x\")] attributes, or because a NamingStrategy (camelCase, snake_case) maps distinct member names onto the same string.","commonSituations":"Refactoring/renaming enum members that then collide under a naming strategy; copy-paste of [EnumMember(Value=...)] values; switching NamingStrategy (e.g. to SnakeCaseNamingStrategy) causing previously-unique names to collapse.","solutions":["Make every [EnumMember(Value=...)] distinct across the enum.","Adjust the NamingStrategy (or member names) so resolved names stay unique.","Rename the colliding enum members so they differ even after transformation.","Audit enum members after changing the serializer's NamingStrategy."],"exampleFix":"// before\n[EnumMember(Value = \"active\")] Active,\n[EnumMember(Value = \"active\")] ActiveNow, // collision -> throws\n// after\n[EnumMember(Value = \"active\")]      Active,\n[EnumMember(Value = \"active_now\")] ActiveNow,","handlingStrategy":"validation","validationCode":"// Detect duplicate resolved enum names before serialization at startup.\nstatic void CheckEnumNames(Type enumType, Newtonsoft.Json.Serialization.NamingStrategy? ns) {\n    var names = Enum.GetNames(enumType).Select(n => ns != null ? ns.GetPropertyName(n, false) : n);\n    if (names.GroupBy(n => n).Any(g => g.Count() > 1)) throw new InvalidOperationException(\"Duplicate enum resolved names.\");\n}","typeGuard":"static bool EnumNamesUnique(Type enumType, Newtonsoft.Json.Serialization.NamingStrategy? ns) => Enum.GetNames(enumType).Select(n => ns != null ? ns.GetPropertyName(n, false) : n).Distinct().Count() == Enum.GetNames(enumType).Length;","tryCatchPattern":"try { JsonConvert.SerializeObject(obj, settings); } catch (InvalidOperationException ex) when (ex.Message.Contains(\"already exists on enum\")) { /* fix [EnumMember]/naming strategy */ }","preventionTips":["Keep [EnumMember(Value=...)] values distinct across the enum.","Re-audit enum members after changing NamingStrategy.","Add a startup test that asserts enum resolved names are unique under your strategy."],"tags":["enum","serialization","configuration","newtonsoft-json"],"analyzedSha":"4f73e74372445108d2c1bda37b36e6f5e43402e0","analyzedAt":"2026-08-07T06:10:08.596Z","schemaVersion":2},"datasetVersion":"2026-08-07T07:17:06.508Z"}