diff --git a/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs index 7c00756a..4e8e21f9 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs @@ -96,6 +96,21 @@ namespace Newtonsoft.Json.Tests.Converters Second, Third } + + public enum NamedEnumWithComma + { + [EnumMember(Value = "@first")] + First, + + [EnumMember(Value = "@second")] + Second, + + [EnumMember(Value = ",third")] + Third, + + [EnumMember(Value = ",")] + JustComma + } #endif public class NegativeEnumClass @@ -165,6 +180,40 @@ namespace Newtonsoft.Json.Tests.Converters }", json); } + [Test] + public void NamedEnumCommaTest() + { + EnumContainer c = new EnumContainer + { + Enum = NamedEnumWithComma.Third + }; + + string json = JsonConvert.SerializeObject(c, Formatting.Indented, new StringEnumConverter()); + Assert.AreEqual(@"{ + ""Enum"": "",third"" +}", json); + + EnumContainer c2 = JsonConvert.DeserializeObject>(json, new StringEnumConverter()); + Assert.AreEqual(NamedEnumWithComma.Third, c2.Enum); + } + + [Test] + public void NamedEnumCommaTest2() + { + EnumContainer c = new EnumContainer + { + Enum = NamedEnumWithComma.JustComma + }; + + string json = JsonConvert.SerializeObject(c, Formatting.Indented, new StringEnumConverter()); + Assert.AreEqual(@"{ + ""Enum"": "","" +}", json); + + EnumContainer c2 = JsonConvert.DeserializeObject>(json, new StringEnumConverter()); + Assert.AreEqual(NamedEnumWithComma.JustComma, c2.Enum); + } + [Test] public void DeserializeNameEnumTest() { diff --git a/Src/Newtonsoft.Json/Utilities/EnumUtils.cs b/Src/Newtonsoft.Json/Utilities/EnumUtils.cs index 69d33dcb..94515751 100644 --- a/Src/Newtonsoft.Json/Utilities/EnumUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/EnumUtils.cs @@ -200,21 +200,28 @@ namespace Newtonsoft.Json.Utilities string finalEnumText; BidirectionalDictionary map = EnumMemberNamesPerType.Get(t); - if (enumText.IndexOf(',') != -1) + string resolvedEnumName; + if (TryResolvedEnumName(map, enumText, out resolvedEnumName)) + { + finalEnumText = resolvedEnumName; + } + else if (enumText.IndexOf(',') != -1) { string[] names = enumText.Split(','); for (int i = 0; i < names.Length; i++) { string name = names[i].Trim(); - names[i] = ResolvedEnumName(map, name); + names[i] = TryResolvedEnumName(map, name, out resolvedEnumName) + ? resolvedEnumName + : name; } finalEnumText = string.Join(", ", names); } else { - finalEnumText = ResolvedEnumName(map, enumText); + finalEnumText = enumText; } return Enum.Parse(t, finalEnumText, true); @@ -246,12 +253,15 @@ namespace Newtonsoft.Json.Utilities return finalName; } - private static string ResolvedEnumName(BidirectionalDictionary map, string enumText) + private static bool TryResolvedEnumName(BidirectionalDictionary map, string enumText, out string resolvedEnumName) { - string resolvedEnumName; - map.TryGetBySecond(enumText, out resolvedEnumName); - resolvedEnumName = resolvedEnumName ?? enumText; - return resolvedEnumName; + if (map.TryGetBySecond(enumText, out resolvedEnumName)) + { + return true; + } + + resolvedEnumName = null; + return false; } } } \ No newline at end of file