সহজে জেএসএন পলায়নের জন্য ব্যবহার করার জন্য কি কোনও শ্রেণি / ফাংশন উপলব্ধ? আমি বরং আমার নিজের লিখতে হবে না।
সহজে জেএসএন পলায়নের জন্য ব্যবহার করার জন্য কি কোনও শ্রেণি / ফাংশন উপলব্ধ? আমি বরং আমার নিজের লিখতে হবে না।
উত্তর:
আমি ব্যবহার করি System.Web.HttpUtility.JavaScriptStringEncode
string quoted = HttpUtility.JavaScriptStringEncode(input);
System.Web.Helpers.Json.Encode
ভিএস ২০১৫ এ হারিয়ে যাওয়া এড়াতে এটি ব্যবহার করেছি, তবে (input, true)
আসল উদ্ধৃতিগুলিও অন্তর্ভুক্ত করার জন্য এটির পরামিতি প্রয়োজন ।
যারা নিউটনসফট থেকে খুব জনপ্রিয় জসন. নেট প্রকল্প ব্যবহার করছেন তাদের পক্ষে কাজটি নগণ্য:
using Newtonsoft.Json;
....
var s = JsonConvert.ToString(@"a\b");
Console.WriteLine(s);
....
এই কোড মুদ্রণ:
"a \\ b"
এটি হ'ল ফলস্বরূপ স্ট্রিংয়ের মানটিতে উদ্ধৃতিগুলির সাথে পালিয়ে যাওয়া ব্যাকস্ল্যাশ রয়েছে।
"WatchedPath": "\\\\myserver\\output"
হয়ে ওঠে "\"\\\\\\\\myserver\\\\output\""
যা বেশ গ্রহণযোগ্য নয়।
দেজন এর উত্তরের ভিত্তিতে বিল্ডিং করা , আপনি যা করতে পারেন তা আমদানি করে System.Web.Helpers
N নেট ফ্রেমওয়ার্ক সমাবেশ , তারপরে নিম্নলিখিত ফাংশনটি ব্যবহার করুন:
static string EscapeForJson(string s) {
string quoted = System.Web.Helpers.Json.Encode(s);
return quoted.Substring(1, quoted.Length - 2);
}
Substring
কল প্রয়োজন বোধ করা হয়, যেহেতু Encode
স্বয়ংক্রিয়ভাবে উদ্ধৃতি চিহ্ন সঙ্গে স্ট্রিং ঘিরে।
হ্যাঁ, কেবলমাত্র আপনার ইউটিলস শ্রেণিতে বা অন্য কিছুতে নিম্নলিখিত ফাংশনটি যুক্ত করুন:
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();
}
/
?
string t = "000" + ((int)c).ToString("X");
t = "000" + String.Format("{0:X}",(int) c);
"\\u" + ((int)c).ToString("X4")
(যদিও আমি মনে করি দুটি সংযোজন আরও ভাল হবে)
আমি জেসনের স্ট্রিংয়ের মান এড়াতে নিম্নলিখিত কোডগুলি ব্যবহার করেছি। নিম্নলিখিত কোডের আউটপুটটিতে আপনাকে আপনার '' 'যুক্ত করতে হবে:
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();
}
এখানে দেওয়া পদ্ধতিগুলি ত্রুটিযুক্ত।
আপনি যখন কেবল মাত্র System.Web.HttpUटिल.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();
}
}
আমি উল্লিখিত জেএসওএন.এনইটি লাইব্রেরিটিও ব্যবহার করার পরামর্শ দেব , তবে ফলত জেএসওএন স্ট্রিংয়ে আপনাকে যদি ইউনিকোড অক্ষরগুলি (যেমন \ uXXXX ফর্ম্যাট) এড়াতে হয় তবে আপনাকে নিজেই এটি করতে হবে। উদাহরণস্বরূপ অ্যাস্কি স্ট্রিং থেকে পালাতে ইউনিকোড স্ট্রিংগুলিতে রূপান্তর করা একবার দেখুন ।
আমি দীর্ঘ উত্তর এবং একটি সংক্ষিপ্ত স্ট্রিংয়ের জন্য এই উত্তরগুলির কয়েকটিতে গতি পরীক্ষা চালিয়েছি। ক্লাইভ প্যাটারসনের কোড বেশ ভালভাবে জিতেছে, সম্ভবতঃ অন্যরা সিরিয়ালের বিকল্পগুলি বিবেচনা করছে। আমার ফলাফলগুলি এখানে:
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();
}
সিস্টেম.ওয়েব.হেল্পার্স.জসন.এনকোড (...) সম্পর্কে কী (দেখুন http://msdn.microsoft.com/en-us/library/system.web.helpers.json.encode(v=vs.111) .aspx )?
নেট কোর 3+ এবং। নেট 5+:
string escapedJsonString = JsonEncodedText.Encode(jsonString);
String.Format("X", c);
যে ঠিক ফলাফল: এক্স
পরিবর্তে এটি চেষ্টা করুন:
string t = ((int)c).ToString("X");
sb.Append("\\u" + t.PadLeft(4, '0'));
আমি খুব ভাল ওয়ান-লাইনার, অন্যদের মতো জসনকনভার্টকে ব্যবহার করেছি তবে যুক্ত উদ্ধৃতি এবং ব্যাকস্ল্যাশ সরিয়ে ফেলতে সাবস্ট্রিং যুক্ত করেছি।
var escapedJsonString = JsonConvert.ToString(JsonString).Substring(1, JsonString.Length - 2);
সেখানে একটি JSON লাইব্রেরি Codeplex
আমি ব্যবহার করতে বেছে নিয়েছি System.Web.Script.Serialization.JavaScriptSerializer
।
আমার নিম্নরূপে সংজ্ঞাযুক্ত একটি ছোট স্ট্যাটিক সহায়ক শ্রেণি রয়েছে:
internal static partial class Serialization
{
static JavaScriptSerializer serializer;
static Serialization()
{
serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
}
public static string ToJSON<T>(T obj)
{
return serializer.Serialize(obj);
}
public static T FromJSON<T>(string data)
{
if (Common.IsEmpty(data))
return default(T);
else
return serializer.Deserialize<T>(data);
}
}
কিছু সিরিয়াল করতে আমি কেবল কল করি Serialization.ToJSON(itemToSerialize)
ডিসেরায়ালাইজ করতে আমি কেবল কল করি Serialization.FromJSON<T>(jsonValueOfTypeT)