diff --git a/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs index 404bcbd5..ef9353f7 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/StringEnumConverterTests.cs @@ -586,6 +586,10 @@ namespace Newtonsoft.Json.Tests.Converters e = JsonConvert.DeserializeObject("\"3\"", converter); Assert.AreEqual(NumberNamesEnum.third, e); + + e = JsonConvert.DeserializeObject("\"-4\"", converter); + + Assert.AreEqual(NumberNamesEnum.fourth, e); } [Test] @@ -604,6 +608,10 @@ namespace Newtonsoft.Json.Tests.Converters e = JsonConvert.DeserializeObject("\"3\"", converter); Assert.AreEqual(NumberNamesEnum.third, e); + + e = JsonConvert.DeserializeObject("\"-4\"", converter); + + Assert.AreEqual(NumberNamesEnum.fourth, e); } #endif @@ -618,6 +626,17 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual("Integer string '1' is not allowed.", ex.InnerException.Message); } + [Test] + public void AllowIntegerValueAndNegativeStringNumber() + { + JsonSerializationException ex = ExceptionAssert.Throws(() => + { + JsonConvert.DeserializeObject("\"-1\"", new StringEnumConverter { AllowIntegerValues = false }); + }); + + Assert.AreEqual("Integer string '-1' is not allowed.", ex.InnerException.Message); + } + [Test] public void AllowIntegerValueAndNonNamedValue() { @@ -714,7 +733,9 @@ namespace Newtonsoft.Json.Tests.Converters [EnumMember(Value = "1")] second, [EnumMember(Value = "3")] - third + third, + [EnumMember(Value = "-4")] + fourth } [DataContract] diff --git a/Src/Newtonsoft.Json/Utilities/EnumUtils.cs b/Src/Newtonsoft.Json/Utilities/EnumUtils.cs index 61017136..edee6731 100644 --- a/Src/Newtonsoft.Json/Utilities/EnumUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/EnumUtils.cs @@ -221,15 +221,7 @@ namespace Newtonsoft.Json.Utilities if (disallowValue) { - bool isNumber = true; - for (int i = 0; i < finalEnumText.Length; i++) - { - if (!char.IsNumber(finalEnumText[i])) - { - isNumber = false; - break; - } - } + bool isNumber = int.TryParse(finalEnumText, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out int _); if (isNumber) {