System.Web.Helpers.Json.EncodeUsé esto para evitar que falten en VS2015, pero también necesita que el (input, true)parámetro incluya las cotizaciones reales.
lapo
47
Para aquellos que utilizan el proyecto Json.Net muy popular de Newtonsoft, la tarea es trivial:
using Newtonsoft.Json;....var s =JsonConvert.ToString(@"a\b");Console.WriteLine(s);....
Este código imprime:
"a \\ b"
Es decir, el valor de la cadena resultante contiene las comillas y la barra invertida de escape.
No puedo reproducir este método para deserializar una ruta unc codificada y escapada. Mi camino se "WatchedPath": "\\\\myserver\\output"convierte en "\"\\\\\\\\myserver\\\\output\""algo bastante inaceptable.
slestak
3
El método anterior no es para deserialización: el evaluador se usa cuando desea crear un texto JSON manualmente y tiene una cadena C # y necesita obtener su representación adecuada como texto.
Dror Harari
@slestak, creo que estoy enfrentando el mismo problema que tu estabas aquí. ¿Encontraste una solución?
GP24
@ GP24 IIRC, no lo hice. Lo siento, no tengo más información.
slestak
No hay problema, gracias por responder. Hice esto si te ayuda: yourAnnoyingDoubleEncodedString.Replace ("\\\\", "\\"). Replace ("\\\" "," \ "");
Sé que esta es una respuesta antigua y me alegra ver que se dio, ya que no quería depender de ninguna biblioteca externa, pero noté que el caso predeterminado para un carácter de control siempre devolverá "\\ u000X". Creo que necesitas lanzar el char primero a un int. Considere reemplazarlo constring t = "000" + ((int)c).ToString("X");
Jan Discart
El caso predeterminado correcto debe ser:t = "000" + String.Format("{0:X}",(int) c);
daniatic
16
He usado el siguiente código para escapar del valor de cadena para json. Debe agregar su '"' a la salida del siguiente 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();}
Esto se puede compactar en
// 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();}}
También recomendaría usar la biblioteca JSON.NET mencionada, pero si tiene que escapar de los caracteres unicode (por ejemplo, formato \ uXXXX) en la cadena JSON resultante, es posible que deba hacerlo usted mismo. Eche un vistazo a Conversión de cadenas Unicode en cadenas ascii de escape para ver un ejemplo.
Realicé pruebas de velocidad en algunas de estas respuestas para una cadena larga y una cadena corta. El código de Clive Paterson ganó por una buena parte, presumiblemente porque los demás están teniendo en cuenta las opciones de serialización. Aquí están mis 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();}
Me gustó una sola línea, usé JsonConvert como lo han hecho otros, pero agregué una subcadena para eliminar las comillas y la barra invertida agregadas.
var escapedJsonString =JsonConvert.ToString(JsonString).Substring(1,JsonString.Length-2);
Respuestas:
yo suelo
System.Web.HttpUtility.JavaScriptStringEncode
fuente
System.Web.Helpers.Json.Encode
Usé esto para evitar que falten en VS2015, pero también necesita que el(input, true)
parámetro incluya las cotizaciones reales.Para aquellos que utilizan el proyecto Json.Net muy popular de Newtonsoft, la tarea es trivial:
Este código imprime:
"a \\ b"
Es decir, el valor de la cadena resultante contiene las comillas y la barra invertida de escape.
fuente
"WatchedPath": "\\\\myserver\\output"
convierte en"\"\\\\\\\\myserver\\\\output\""
algo bastante inaceptable.Basándose en la respuesta de Dejan , lo que puede hacer es importar el
System.Web.Helpers
ensamblaje de .NET Framework y luego usar la siguiente función:La
Substring
llamada es necesaria, ya queEncode
rodea automáticamente las cadenas con comillas dobles.fuente
Sí, simplemente agregue la siguiente función a su clase de Utils o algo así:
fuente
/
?string t = "000" + ((int)c).ToString("X");
t = "000" + String.Format("{0:X}",(int) c);
He usado el siguiente código para escapar del valor de cadena para json. Debe agregar su '"' a la salida del siguiente código:
fuente
Los métodos ofrecidos aquí son defectuosos.
¿Por qué aventurarse tan lejos cuando podría usar System.Web.HttpUtility.JavaScriptEncode?
Si está en un marco inferior, puede copiarlo y pegarlo desde mono
Cortesía del mono-proyecto @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Esto se puede compactar en
fuente
También recomendaría usar la biblioteca JSON.NET mencionada, pero si tiene que escapar de los caracteres unicode (por ejemplo, formato \ uXXXX) en la cadena JSON resultante, es posible que deba hacerlo usted mismo. Eche un vistazo a Conversión de cadenas Unicode en cadenas ascii de escape para ver un ejemplo.
fuente
Realicé pruebas de velocidad en algunas de estas respuestas para una cadena larga y una cadena corta. El código de Clive Paterson ganó por una buena parte, presumiblemente porque los demás están teniendo en cuenta las opciones de serialización. Aquí están mis resultados:
Y aquí está el código de prueba:
fuente
¿Qué pasa con System.Web.Helpers.Json.Encode (...) (consulte http://msdn.microsoft.com/en-us/library/system.web.helpers.json.encode(v=vs.111) .aspx )?
fuente
Eso solo genera: X
Prueba esto en su lugar:
fuente
Me gustó una sola línea, usé JsonConvert como lo han hecho otros, pero agregué una subcadena para eliminar las comillas y la barra invertida agregadas.
fuente
En .Net Core 3+ y .Net 5+:
fuente
Hay una biblioteca Json en Codeplex
fuente
Elegí usar
System.Web.Script.Serialization.JavaScriptSerializer
.Tengo una pequeña clase auxiliar estática definida de la siguiente manera:
Para serializar todo lo que acabo de llamar
Serialization.ToJSON(itemToSerialize)
Para deserializar solo llamo
Serialization.FromJSON<T>(jsonValueOfTypeT)
fuente