diff --git a/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs b/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs index 3f61d7d9..731d9c37 100644 --- a/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs @@ -580,6 +580,21 @@ namespace Newtonsoft.Json.Tests Assert.AreEqual(@"""It's a good day\r\n\""sunshine\""""", json); } + [Test] + public void ToStringStringEscapeHandling() + { + string v = "hi " + '\u20AC' + ""; + + string json = JsonConvert.ToString(v, '"'); + Assert.AreEqual(@"""hi " + '\u20AC' + @"""", json); + + json = JsonConvert.ToString(v, '"', StringEscapeHandling.EscapeHtml); + Assert.AreEqual(@"""\u003cb\u003ehi " + '\u20AC' + @"\u003c/b\u003e""", json); + + json = JsonConvert.ToString(v, '"', StringEscapeHandling.EscapeNonAscii); + Assert.AreEqual(@"""hi \u20ac""", json); + } + [Test] public void WriteDateTime() { diff --git a/Src/Newtonsoft.Json.Tests/PerformanceTests.cs b/Src/Newtonsoft.Json.Tests/PerformanceTests.cs index 87afe960..d997f2ca 100644 --- a/Src/Newtonsoft.Json.Tests/PerformanceTests.cs +++ b/Src/Newtonsoft.Json.Tests/PerformanceTests.cs @@ -182,7 +182,7 @@ namespace Newtonsoft.Json.Tests [Test] public void DeserializeLargeJson() { - for (int i = 0; i < 100; i++) + for (int i = 0; i < 5; i++) { using (var fs = System.IO.File.OpenText("large.json")) using (JsonTextReader jsonTextReader = new JsonTextReader(fs)) diff --git a/Src/Newtonsoft.Json/JsonConvert.cs b/Src/Newtonsoft.Json/JsonConvert.cs index e29f4829..ade9cfff 100644 --- a/Src/Newtonsoft.Json/JsonConvert.cs +++ b/Src/Newtonsoft.Json/JsonConvert.cs @@ -409,11 +409,6 @@ namespace Newtonsoft.Json return ToString(value, '"'); } - public static string ToString(string value, StringEscapeHandling stringEscapeHandling) - { - return ToString(value, '"', stringEscapeHandling); - } - /// /// Converts the to its JSON string representation. /// @@ -425,6 +420,13 @@ namespace Newtonsoft.Json return ToString(value, delimiter, StringEscapeHandling.Default); } + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// The string delimiter character. + /// The string escape handling. + /// A JSON string representation of the . public static string ToString(string value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') diff --git a/Src/Newtonsoft.Json/JsonTextWriter.cs b/Src/Newtonsoft.Json/JsonTextWriter.cs index dae0acce..771fbac0 100644 --- a/Src/Newtonsoft.Json/JsonTextWriter.cs +++ b/Src/Newtonsoft.Json/JsonTextWriter.cs @@ -253,12 +253,7 @@ namespace Newtonsoft.Json private void UpdateCharEscapeFlags() { - if (StringEscapeHandling == StringEscapeHandling.EscapeHtml) - _charEscapeFlags = JavaScriptUtils.HtmlCharEscapeFlags; - else if (_quoteChar == '"') - _charEscapeFlags = JavaScriptUtils.DoubleQuoteCharEscapeFlags; - else - _charEscapeFlags = JavaScriptUtils.SingleQuoteCharEscapeFlags; + _charEscapeFlags = JavaScriptUtils.GetCharEscapeFlags(StringEscapeHandling, _quoteChar); } /// diff --git a/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs b/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs index 6a1e5f3c..378db190 100644 --- a/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs @@ -72,6 +72,17 @@ namespace Newtonsoft.Json.Utilities private const string EscapedUnicodeText = "!"; + public static bool[] GetCharEscapeFlags(StringEscapeHandling stringEscapeHandling, char quoteChar) + { + if (stringEscapeHandling == StringEscapeHandling.EscapeHtml) + return HtmlCharEscapeFlags; + + if (quoteChar == '"') + return DoubleQuoteCharEscapeFlags; + + return SingleQuoteCharEscapeFlags; + } + public static bool ShouldEscapeJavaScriptString(string s, bool[] charEscapeFlags) { if (s == null) @@ -230,10 +241,12 @@ namespace Newtonsoft.Json.Utilities public static string ToEscapedJavaScriptString(string value, char delimiter, bool appendDelimiters, StringEscapeHandling stringEscapeHandling) { + bool[] charEscapeFlags = GetCharEscapeFlags(stringEscapeHandling, delimiter); + using (StringWriter w = StringUtils.CreateStringWriter(StringUtils.GetLength(value) ?? 16)) { char[] buffer = null; - WriteEscapedJavaScriptString(w, value, delimiter, appendDelimiters, (delimiter == '"') ? DoubleQuoteCharEscapeFlags : SingleQuoteCharEscapeFlags, stringEscapeHandling, ref buffer); + WriteEscapedJavaScriptString(w, value, delimiter, appendDelimiters, charEscapeFlags, stringEscapeHandling, ref buffer); return w.ToString(); } }