Ich habe dies verwendet, um das Fehlen System.Web.Helpers.Json.Encodein VS2015 zu vermeiden , aber der (input, true)Parameter muss auch die tatsächlichen Anführungszeichen enthalten.
Lapo
47
Für diejenigen, die das sehr beliebte Json.Net-Projekt von Newtonsoft verwenden, ist die Aufgabe trivial:
using Newtonsoft.Json;....var s =JsonConvert.ToString(@"a\b");Console.WriteLine(s);....
Dieser Code druckt:
"a \\ b"
Das heißt, der resultierende Zeichenfolgenwert enthält die Anführungszeichen sowie den maskierten Backslash.
Ich kann diese Methode zum Deserialisieren eines codierten und entkommenen unc-Pfads nicht reproduzieren. Mein Weg "WatchedPath": "\\\\myserver\\output"wird "\"\\\\\\\\myserver\\\\output\""ziemlich inakzeptabel.
Slestak
3
Die obige Methode ist nicht zum Deserialisieren gedacht. Sie wird verwendet, wenn Sie einen JSON-Text manuell erstellen möchten und eine C # -String haben und die richtige Darstellung als Text erhalten müssen.
Dror Harari
@ Slestak, ich glaube, ich stehe vor dem gleichen Problem, mit dem Sie hier waren. Haben Sie eine Lösung gefunden?
GP24
@ GP24 IIRC habe ich nicht. Entschuldigung, ich habe keine weiteren Informationen.
Slestak
Kein Problem, danke für die Antwort. Ich habe dies getan, wenn es Ihnen hilft: yourAnnoyingDoubleEncodedString.Replace ("\\\\", "\\"). Replace ("\\\" "," \ "");
Ich weiß, dass dies eine alte Antwort ist, und ich bin froh zu sehen, dass dies gegeben wurde, da ich mich nicht auf externe Bibliotheken verlassen wollte, aber ich habe festgestellt, dass der Standardfall für ein Steuerzeichen immer "\\ u000X" zurückgibt. Ich glaube, Sie müssen den Char zuerst auf einen Int werfen. Erwägen Sie, es durchstring t = "000" + ((int)c).ToString("X");
Jan Discart
Der korrekte Standardfall muss sein:t = "000" + String.Format("{0:X}",(int) c);
daniatic
16
Ich habe folgenden Code verwendet, um den Zeichenfolgenwert für json zu umgehen. Sie müssen Ihr '"' zur Ausgabe des folgenden Codes hinzufügen:
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();}
Dies kann verdichtet werden
// 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();}}
Ich würde auch empfehlen, die erwähnte JSON.NET- Bibliothek zu verwenden. Wenn Sie jedoch Unicode-Zeichen (z. B. das Format \ uXXXX) in der resultierenden JSON-Zeichenfolge maskieren müssen, müssen Sie dies möglicherweise selbst tun. Ein Beispiel finden Sie unter Konvertieren von Unicode-Zeichenfolgen in maskierte ASCII-Zeichenfolgen .
Bei einigen dieser Antworten habe ich Geschwindigkeitstests für eine lange und eine kurze Zeichenfolge durchgeführt. Clive Patersons Code hat ein gutes Stück gewonnen, vermutlich weil die anderen Serialisierungsoptionen berücksichtigen. Hier sind meine Ergebnisse:
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();}
Ich habe einen schönen Einzeiler verwendet, JsonConvert wie andere verwendet, aber Teilzeichenfolgen hinzugefügt, um die hinzugefügten Anführungszeichen und den umgekehrten Schrägstrich zu entfernen.
var escapedJsonString =JsonConvert.ToString(JsonString).Substring(1,JsonString.Length-2);
Antworten:
ich benutze
System.Web.HttpUtility.JavaScriptStringEncode
quelle
System.Web.Helpers.Json.Encode
in VS2015 zu vermeiden , aber der(input, true)
Parameter muss auch die tatsächlichen Anführungszeichen enthalten.Für diejenigen, die das sehr beliebte Json.Net-Projekt von Newtonsoft verwenden, ist die Aufgabe trivial:
Dieser Code druckt:
"a \\ b"
Das heißt, der resultierende Zeichenfolgenwert enthält die Anführungszeichen sowie den maskierten Backslash.
quelle
"WatchedPath": "\\\\myserver\\output"
wird"\"\\\\\\\\myserver\\\\output\""
ziemlich inakzeptabel.Aufbauend auf der Antwort von Dejan können Sie die .NET Framework-Assembly importieren
System.Web.Helpers
und dann die folgende Funktion verwenden:Der
Substring
Aufruf ist erforderlich, daEncode
Zeichenfolgen automatisch in doppelte Anführungszeichen gesetzt werden.quelle
Ja, fügen Sie Ihrer Utils-Klasse einfach die folgende Funktion hinzu oder so:
quelle
/
?string t = "000" + ((int)c).ToString("X");
t = "000" + String.Format("{0:X}",(int) c);
Ich habe folgenden Code verwendet, um den Zeichenfolgenwert für json zu umgehen. Sie müssen Ihr '"' zur Ausgabe des folgenden Codes hinzufügen:
quelle
Die hier angebotenen Methoden sind fehlerhaft.
Warum so weit gehen, wenn Sie nur System.Web.HttpUtility.JavaScriptEncode verwenden könnten?
Wenn Sie sich in einem niedrigeren Framework befinden, können Sie es einfach kopieren und aus Mono einfügen
Mit freundlicher Genehmigung des Monoprojekts @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Dies kann verdichtet werden
quelle
Ich würde auch empfehlen, die erwähnte JSON.NET- Bibliothek zu verwenden. Wenn Sie jedoch Unicode-Zeichen (z. B. das Format \ uXXXX) in der resultierenden JSON-Zeichenfolge maskieren müssen, müssen Sie dies möglicherweise selbst tun. Ein Beispiel finden Sie unter Konvertieren von Unicode-Zeichenfolgen in maskierte ASCII-Zeichenfolgen .
quelle
Bei einigen dieser Antworten habe ich Geschwindigkeitstests für eine lange und eine kurze Zeichenfolge durchgeführt. Clive Patersons Code hat ein gutes Stück gewonnen, vermutlich weil die anderen Serialisierungsoptionen berücksichtigen. Hier sind meine Ergebnisse:
Und hier ist der Testcode:
quelle
Was ist mit System.Web.Helpers.Json.Encode (...) (siehe http://msdn.microsoft.com/en-us/library/system.web.helpers.json.encode(v=vs.111) .aspx )?
quelle
Das gibt nur aus: X.
Versuchen Sie stattdessen Folgendes:
quelle
Ich habe einen schönen Einzeiler verwendet, JsonConvert wie andere verwendet, aber Teilzeichenfolgen hinzugefügt, um die hinzugefügten Anführungszeichen und den umgekehrten Schrägstrich zu entfernen.
quelle
In .Net Core 3+ und .Net 5+:
quelle
Es gibt eine Json-Bibliothek bei Codeplex
quelle