Usei isso para evitar a falta System.Web.Helpers.Json.Encodeno VS2015, mas ele precisa do (input, true)parâmetro para incluir as cotações reais também.
lapo
47
Para aqueles que usam o popular projeto Json.Net da Newtonsoft, a tarefa é trivial:
using Newtonsoft.Json;....var s =JsonConvert.ToString(@"a\b");Console.WriteLine(s);....
Este código imprime:
"a \\ b"
Ou seja, o valor da string resultante contém as aspas, bem como a barra invertida com escape.
Não posso reproduzir este método para desserializar um caminho unc codificado e escapado. Meu caminho "WatchedPath": "\\\\myserver\\output"se torna, o "\"\\\\\\\\myserver\\\\output\""que é bastante inaceitável.
slestak
3
O método acima não é para desserializar - avaliador ele é usado quando você deseja criar um texto JSON manualmente e você tem uma string C # e precisa obter sua representação adequada como um texto.
Dror Harari
@slestak, acho que estou enfrentando o mesmo problema que você estava aqui. Você encontrou uma solução?
GP24 de
@ GP24 IIRC, eu não fiz. Desculpe, não tenho mais informações.
slestak de
Não tem problema, obrigado por responder. Eu fiz isso se te ajudar: yourAnnoyingDoubleEncodedString.Replace ("\\\\", "\\"). Replace ("\\\" "," \ "");
Eu sei que esta é uma resposta antiga e estou feliz em ver que isso foi dado, pois não queria depender de nenhuma biblioteca externa, mas percebi que o caso padrão para um caractere de controle sempre retornará "\\ u000X". Eu acredito que você precisa converter o char primeiro para um int. Considere substituí-lo porstring t = "000" + ((int)c).ToString("X");
Jan Discart
O caso padrão correto deve ser:t = "000" + String.Format("{0:X}",(int) c);
daniático
16
Usei o código a seguir para escapar do valor da string para json. Você precisa adicionar seu '"' à saída do seguinte código:
publicstaticstringJavaScriptStringEncode(stringvalue,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 =newSystem.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);elseswitch((int)c){case8:
sb.Append("\\b");break;case9:
sb.Append("\\t");break;case10:
sb.Append("\\n");break;case12:
sb.Append("\\f");break;case13:
sb.Append("\\r");break;case34:
sb.Append("\\\"");break;case92:
sb.Append("\\\\");break;default:
sb.Append(c);break;}}if(addDoubleQuotes)
sb.Append('"');return sb.ToString();}
Isso pode ser compactado em
// https://github.com/mono/mono/blob/master/mcs/class/System.Json/System.Json/JsonValue.cspublicclassSimpleJSON{privatestaticboolNeedEscape(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]=='<');}publicstaticstringEscapeString(string src){System.Text.StringBuilder sb =newSystem.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();}}
Eu também recomendaria usar a biblioteca JSON.NET mencionada, mas se você tiver que escapar caracteres Unicode (por exemplo, formato \ uXXXX) na string JSON resultante, você pode ter que fazer isso sozinho. Dê uma olhada em Convertendo strings Unicode em string ASCII com escape para um exemplo.
Fiz testes de velocidade em algumas dessas respostas para uma string longa e uma string curta. O código de Clive Paterson ganhou por uma boa parte, provavelmente porque os outros estão levando em consideração as opções de serialização. Aqui estão meus resultados:
publicstaticvoidMain(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 innew[]{ testStr1, testStr2 }){var results =newDictionary<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();}
Respostas:
eu uso
System.Web.HttpUtility.JavaScriptStringEncode
fonte
System.Web.Helpers.Json.Encode
no VS2015, mas ele precisa do(input, true)
parâmetro para incluir as cotações reais também.Para aqueles que usam o popular projeto Json.Net da Newtonsoft, a tarefa é trivial:
Este código imprime:
"a \\ b"
Ou seja, o valor da string resultante contém as aspas, bem como a barra invertida com escape.
fonte
"WatchedPath": "\\\\myserver\\output"
se torna, o"\"\\\\\\\\myserver\\\\output\""
que é bastante inaceitável.Com base na resposta de Dejan , o que você pode fazer é importar o
System.Web.Helpers
assembly do .NET Framework e usar a seguinte função:A
Substring
chamada é necessária, poisEncode
envolve automaticamente as strings com aspas duplas.fonte
Sim, basta adicionar a seguinte função à sua classe Utils ou algo assim:
fonte
/
?string t = "000" + ((int)c).ToString("X");
t = "000" + String.Format("{0:X}",(int) c);
Usei o código a seguir para escapar do valor da string para json. Você precisa adicionar seu '"' à saída do seguinte código:
fonte
Os métodos oferecidos aqui estão com defeito.
Por que se aventurar tão longe quando você poderia apenas usar System.Web.HttpUtility.JavaScriptEncode?
Se você estiver em um framework inferior, você pode apenas copiar e colar do mono
Cortesia do mono-projeto @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Isso pode ser compactado em
fonte
Eu também recomendaria usar a biblioteca JSON.NET mencionada, mas se você tiver que escapar caracteres Unicode (por exemplo, formato \ uXXXX) na string JSON resultante, você pode ter que fazer isso sozinho. Dê uma olhada em Convertendo strings Unicode em string ASCII com escape para um exemplo.
fonte
Fiz testes de velocidade em algumas dessas respostas para uma string longa e uma string curta. O código de Clive Paterson ganhou por uma boa parte, provavelmente porque os outros estão levando em consideração as opções de serialização. Aqui estão meus resultados:
E aqui está o código de teste:
fonte
E sobre System.Web.Helpers.Json.Encode (...) (consulte http://msdn.microsoft.com/en-us/library/system.web.helpers.json.encode(v=vs.111) .aspx )?
fonte
Isso resulta apenas em: X
Em vez disso, tente isto:
fonte
Eu nice one-liner, usei JsonConvert como outros fizeram, mas adicionei substring para remover as aspas adicionadas e barra invertida.
fonte
Em .Net Core 3+ e .Net 5+:
fonte
Há uma biblioteca Json na Codeplex
fonte
Eu escolhi usar
System.Web.Script.Serialization.JavaScriptSerializer
.Eu tenho uma pequena classe auxiliar estática definida da seguinte maneira:
Para serializar qualquer coisa eu apenas chamo
Serialization.ToJSON(itemToSerialize)
Para desserializar eu apenas chamo
Serialization.FromJSON<T>(jsonValueOfTypeT)
fonte