Существуют ли какие-либо классы/функции, которые можно использовать для простого ускорения JSON? Я бы предпочел не писать свои собственные.Как избежать строки JSON?
ответ
Я также рекомендую использовать JSON.NET библиотеку упоминалось, но если у вас есть, чтобы избежать символов Юникода (например, \ формат ихххх) в результирующую строку JSON, вы, возможно, придется сделать это сам. Посмотрите на пример Converting Unicode strings to escaped ascii string.
Да, просто добавьте следующую функцию в класс Utils или что-то:
public static string cleanForJSON(string s)
{
if (s == null || s.Length == 0) {
return "";
}
char c = '\0';
int i;
int len = s.Length;
StringBuilder sb = new StringBuilder(len + 4);
String t;
for (i = 0; i < len; i += 1) {
c = s[i];
switch (c) {
case '\\':
case '"':
sb.Append('\\');
sb.Append(c);
break;
case '/':
sb.Append('\\');
sb.Append(c);
break;
case '\b':
sb.Append("\\b");
break;
case '\t':
sb.Append("\\t");
break;
case '\n':
sb.Append("\\n");
break;
case '\f':
sb.Append("\\f");
break;
case '\r':
sb.Append("\\r");
break;
default:
if (c < ' ') {
t = "000" + String.Format("X", c);
sb.Append("\\u" + t.Substring(t.Length - 4));
} else {
sb.Append(c);
}
break;
}
}
return sb.ToString();
}
Зачем вам нужно избегать '/'? – drzaus
Я использовал следующий код, чтобы избежать строковое значение для JSON. Вам нужно, чтобы добавить свой «"»к выходу следующего кода:
public static string EscapeStringValue(string value)
{
const char BACK_SLASH = '\\';
const char SLASH = '/';
const char DBL_QUOTE = '"';
var output = new StringBuilder(value.Length);
foreach (char c in value)
{
switch (c)
{
case SLASH:
output.AppendFormat("{0}{1}", BACK_SLASH, SLASH);
break;
case BACK_SLASH:
output.AppendFormat("{0}{0}", BACK_SLASH);
break;
case DBL_QUOTE:
output.AppendFormat("{0}{1}",BACK_SLASH,DBL_QUOTE);
break;
default:
output.Append(c);
break;
}
}
return output.ToString();
}
String.Format("X", c);
Это просто выводит: X
Попробуйте вместо этого:
string t = ((int)c).ToString("X");
sb.Append("\\u" + t.PadLeft(4, '0'));
Что о системе .Web.Helpers.Json.Encode (...) (см. http://msdn.microsoft.com/en-us/library/system.web.helpers.json.encode(v=vs.111).aspx)?
Основание на the answer by Dejan, что вы можете сделать, это import System.Web.Helpers
.NET Framework assembly, а затем использовать следующую функцию:
static string EscapeForJson(string s) {
string quoted = System.Web.Helpers.Json.Encode(s);
return quoted.Substring(1, quoted.Length - 2);
}
обязательно заполняемая Substring
вызова, поскольку Encode
автоматически окружает строки в двойных кавычках.
Для тех, кто использует очень популярный проект Json.NET от Newtonsoft задача тривиальна:
using Newtonsoft.Json;
....
var s = JsonConvert.ToString("a\\b");
Console.WriteLine(s);
....
Этот код печатает:
"а \\ Ь"
То есть, итоговое строковое значение содержит кавычки, а также экранированную обратную косую черту.
Я не могу воспроизвести этот метод для десериализации кодированного и экранированного пути. Мой путь '' WatchedPath ":" \\\\ myserver \\ output "' становится '" \ "\\\\\\\\ myserver \\\\ output \" "', что довольно неприемлемо. – slestak
Метод выше не для десериализации - rater он используется, когда вы хотите создать текст JSON вручную, и у вас есть строка C#, и вам нужно получить правильное представление в виде текста. –
@slestak, я думаю, я столкнулся с той же проблемой, что и вы здесь. Вы нашли решение? – GP24
Я использую System.Web.HttpUtility.JavaScriptStringEncode
string quoted = HttpUtility.JavaScriptStringEncode(input);
Я использовал это, чтобы избежать отсутствующего «System.Web.Helpers.Json.Encode» в VS2015, но для параметра «(вход, истина)» требуется включить фактические кавычки. – lapo
Я провел тесты скорости на некоторых из этих ответов на длинную строку и короткую строку. Клайв Патерсон code выиграл хороший бит, предположительно потому, что другие учитывают варианты сериализации. Вот мои результаты:
Apple Banana
System.Web.HttpUtility.JavaScriptStringEncode: 140ms
System.Web.Helpers.Json.Encode: 326ms
Newtonsoft.Json.JsonConvert.ToString: 230ms
Clive Paterson: 108ms
\\some\long\path\with\lots\of\things\to\escape\some\long\path\t\with\lots\of\n\things\to\escape\some\long\path\with\lots\of\"things\to\escape\some\long\path\with\lots"\of\things\to\escape
System.Web.HttpUtility.JavaScriptStringEncode: 2849ms
System.Web.Helpers.Json.Encode: 3300ms
Newtonsoft.Json.JsonConvert.ToString: 2827ms
Clive Paterson: 1173ms
А вот тестовый код:
public static void Main(string[] args)
{
var testStr1 = "Apple Banana";
var testStr2 = @"\\some\long\path\with\lots\of\things\to\escape\some\long\path\t\with\lots\of\n\things\to\escape\some\long\path\with\lots\of\""things\to\escape\some\long\path\with\lots""\of\things\to\escape";
foreach (var testStr in new[] { testStr1, testStr2 })
{
var results = new Dictionary<string,List<long>>();
for (var n = 0; n < 10; n++)
{
var count = 1000 * 1000;
var sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
var s = System.Web.HttpUtility.JavaScriptStringEncode(testStr);
}
var t = sw.ElapsedMilliseconds;
results.GetOrCreate("System.Web.HttpUtility.JavaScriptStringEncode").Add(t);
sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
var s = System.Web.Helpers.Json.Encode(testStr);
}
t = sw.ElapsedMilliseconds;
results.GetOrCreate("System.Web.Helpers.Json.Encode").Add(t);
sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
var s = Newtonsoft.Json.JsonConvert.ToString(testStr);
}
t = sw.ElapsedMilliseconds;
results.GetOrCreate("Newtonsoft.Json.JsonConvert.ToString").Add(t);
sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
var s = cleanForJSON(testStr);
}
t = sw.ElapsedMilliseconds;
results.GetOrCreate("Clive Paterson").Add(t);
}
Console.WriteLine(testStr);
foreach (var result in results)
{
Console.WriteLine(result.Key + ": " + Math.Round(result.Value.Skip(1).Average()) + "ms");
}
Console.WriteLine();
}
Console.ReadLine();
}
Методы, предлагаемые здесь неисправны.
Зачем рисковать тем, что вы можете использовать System.Web.HttpUtility.JavaScriptEncode?
Если вы находитесь на нижней рамки, вы можете просто скопировать мимо него из моно
Предоставлено моно-проекта @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
public static string JavaScriptStringEncode(string value, bool addDoubleQuotes)
{
if (string.IsNullOrEmpty(value))
return addDoubleQuotes ? "\"\"" : string.Empty;
int len = value.Length;
bool needEncode = false;
char c;
for (int i = 0; i < len; i++)
{
c = value[i];
if (c >= 0 && c <= 31 || c == 34 || c == 39 || c == 60 || c == 62 || c == 92)
{
needEncode = true;
break;
}
}
if (!needEncode)
return addDoubleQuotes ? "\"" + value + "\"" : value;
var sb = new System.Text.StringBuilder();
if (addDoubleQuotes)
sb.Append('"');
for (int i = 0; i < len; i++)
{
c = value[i];
if (c >= 0 && c <= 7 || c == 11 || c >= 14 && c <= 31 || c == 39 || c == 60 || c == 62)
sb.AppendFormat("\\u{0:x4}", (int)c);
else switch ((int)c)
{
case 8:
sb.Append("\\b");
break;
case 9:
sb.Append("\\t");
break;
case 10:
sb.Append("\\n");
break;
case 12:
sb.Append("\\f");
break;
case 13:
sb.Append("\\r");
break;
case 34:
sb.Append("\\\"");
break;
case 92:
sb.Append("\\\\");
break;
default:
sb.Append(c);
break;
}
}
if (addDoubleQuotes)
sb.Append('"');
return sb.ToString();
}
Это может быть спрессованы в
// https://github.com/mono/mono/blob/master/mcs/class/System.Json/System.Json/JsonValue.cs
public class SimpleJSON
{
private static bool NeedEscape(string src, int i)
{
char c = src[i];
return c < 32 || c == '"' || c == '\\'
// Broken lead surrogate
|| (c >= '\uD800' && c <= '\uDBFF' &&
(i == src.Length - 1 || src[i + 1] < '\uDC00' || src[i + 1] > '\uDFFF'))
// Broken tail surrogate
|| (c >= '\uDC00' && c <= '\uDFFF' &&
(i == 0 || src[i - 1] < '\uD800' || src[i - 1] > '\uDBFF'))
// To produce valid JavaScript
|| c == '\u2028' || c == '\u2029'
// Escape "</" for <script> tags
|| (c == '/' && i > 0 && src[i - 1] == '<');
}
public static string EscapeString(string src)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
int start = 0;
for (int i = 0; i < src.Length; i++)
if (NeedEscape(src, i))
{
sb.Append(src, start, i - start);
switch (src[i])
{
case '\b': sb.Append("\\b"); break;
case '\f': sb.Append("\\f"); break;
case '\n': sb.Append("\\n"); break;
case '\r': sb.Append("\\r"); break;
case '\t': sb.Append("\\t"); break;
case '\"': sb.Append("\\\""); break;
case '\\': sb.Append("\\\\"); break;
case '/': sb.Append("\\/"); break;
default:
sb.Append("\\u");
sb.Append(((int)src[i]).ToString("x04"));
break;
}
start = i + 1;
}
sb.Append(src, start, src.Length - start);
return sb.ToString();
}
}
- 1. Как избежать «\» из строки JSON в титане?
- 2. Как избежать этого многомерного json-массива/строки
- 3. Как избежать строки для хранения в JSON
- 4. Как избежать json hijacking
- 5. Как избежать строки JQuery
- 6. Как избежать отображения строки JSON с пользовательским typeahead
- 7. Как избежать специальных символов при построении строки JSON?
- 8. Как избежать строк в JSON?
- 9. Как избежать HTML в JSON
- 10. Как избежать JSON, как вам избежать вывода, чтобы предотвратить XSS
- 11. Как избежать обратной косой черты в JSON?
- 12. Как избежать использования eval скриптов из JSON?
- 13. Как избежать новой строки из строки
- 14. как избежать строки в Mysqli
- 15. Как избежать строки в бритве?
- 16. Как избежать строки в Android?
- 17. Как избежать строки в Java?
- 18. Как избежать создания новой строки?
- 19. Как избежать строки для XML?
- 20. Как избежать строки в mySQL
- 21. Как избежать строки в .aspx
- 22. Как избежать строки для HTML?
- 23. MySQL, как избежать дублирования строки
- 24. Как избежать определенных символов строки?
- 25. Как избежать # # из строки интерполяции
- 26. JSON - слеши не избежать
- 27. JSON.parse избежать новой строки символов
- 28. Omnifaces избежать JSON строк
- 29. Что значит избежать строки?
- 30. Правильный способ избежать строки
JsonConvert.ToString() работал для меня. –