কিভাবে JSON স্ট্রিং এড়ানোর?


101

সহজে জেএসএন পলায়নের জন্য ব্যবহার করার জন্য কি কোনও শ্রেণি / ফাংশন উপলব্ধ? আমি বরং আমার নিজের লিখতে হবে না।


4
জসনকনভার্ট.টস্ট্রিং () আমার পক্ষে কাজ করেছে।
মার্টিন লটারিং

@ মার্টিনলটারিং আপনাকে ধন্যবাদ !!! আমি একটি ফর্ম্যাট স্ট্রিংতে জসন পাওয়ার উপায় খুঁজছি। নীচের উত্তরগুলির কোনওটিই কাজ করে নি, তবে এটি করেছে।
ঘোস্টশমন

উত্তর:


81

আমি ব্যবহার করি System.Web.HttpUtility.JavaScriptStringEncode

string quoted = HttpUtility.JavaScriptStringEncode(input);

4
আমি System.Web.Helpers.Json.Encodeভিএস ২০১৫ এ হারিয়ে যাওয়া এড়াতে এটি ব্যবহার করেছি, তবে (input, true)আসল উদ্ধৃতিগুলিও অন্তর্ভুক্ত করার জন্য এটির পরামিতি প্রয়োজন ।
lapo

এটি আমার জন্য অনুপস্থিত লিঙ্কটি ছিল
জাবিদ হাসিম

50

যারা নিউটনসফট থেকে খুব জনপ্রিয় জসন. নেট প্রকল্প ব্যবহার করছেন তাদের পক্ষে কাজটি নগণ্য:

using Newtonsoft.Json;

....
var s = JsonConvert.ToString(@"a\b");
Console.WriteLine(s);
....

এই কোড মুদ্রণ:

"a \\ b"

এটি হ'ল ফলস্বরূপ স্ট্রিংয়ের মানটিতে উদ্ধৃতিগুলির সাথে পালিয়ে যাওয়া ব্যাকস্ল্যাশ রয়েছে।


4
কোনও এনকোডযুক্ত এবং অব্যাহতিহীন পথ অবলম্বনের জন্য আমি এই পদ্ধতিটি পুনরুত্পাদন করতে পারি না। আমার পথটি "WatchedPath": "\\\\myserver\\output"হয়ে ওঠে "\"\\\\\\\\myserver\\\\output\""যা বেশ গ্রহণযোগ্য নয়।
শুক্রবার

4
উপরের পদ্ধতিটি deserialization করার জন্য নয় - আপনি যখন JSON পাঠ্য নিজে হাতে তৈরি করতে চান তখন এটি ব্যবহার করা হয় এবং আপনার সি # স্ট্রিং রয়েছে এবং এটি একটি পাঠ্য হিসাবে এর যথাযথ প্রতিনিধিত্ব পাওয়ার প্রয়োজন।
আতঙ্ক হারারি

@ স্লেস্টক, আমি মনে করি আপনি এখানে যে একই সমস্যার মুখোমুখি হয়েছিলেন I আপনি কি সমাধান খুঁজে পেয়েছেন?
জিপি 24

@ জিপি ২৪ আইআইআরসি, আমি করিনি। দুঃখিত, আমার আর কোনও তথ্য নেই।
শুক্রবার

কোন সমস্যা নেই, উত্তর দেওয়ার জন্য ধন্যবাদ। এটি আপনাকে সহায়তা করলে আমি এটি করেছি: yourAnnoyingDoubleEncodedString.Replace ("\\\\", "\\") Rep প্রতিস্থাপন ("\\\" "," \ "");
জিপি 24

40

দেজন এর উত্তরের ভিত্তিতে বিল্ডিং করা , আপনি যা করতে পারেন তা আমদানি করে System.Web.HelpersN নেট ফ্রেমওয়ার্ক সমাবেশ , তারপরে নিম্নলিখিত ফাংশনটি ব্যবহার করুন:

static string EscapeForJson(string s) {
  string quoted = System.Web.Helpers.Json.Encode(s);
  return quoted.Substring(1, quoted.Length - 2);
}

Substringকল প্রয়োজন বোধ করা হয়, যেহেতু Encodeস্বয়ংক্রিয়ভাবে উদ্ধৃতি চিহ্ন সঙ্গে স্ট্রিং ঘিরে।


দেখে মনে হচ্ছে System.Web.Helpers এর আগে পাওয়া যায় না। নেট 4.0
সার্জ

… এবং ভিজ্যুয়াল স্টুডিও 2015 এ আর নেই।
লাও

4
এটি ASP.NET ওয়েব পৃষ্ঠাগুলি 2.0 এর অংশ। এটি নুগেট ব্যবহার করে যুক্ত করা যেতে পারে। এটি কাঠামোর অংশ নয়।
মারভেন

31

হ্যাঁ, কেবলমাত্র আপনার ইউটিলস শ্রেণিতে বা অন্য কিছুতে নিম্নলিখিত ফাংশনটি যুক্ত করুন:

    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();
    }

4
তোমার পালাতে হবে কেন /?
ড্রজাউস

আমি জানি এটি একটি পুরানো উত্তর এবং আমি কোনও বাহ্যিক গ্রন্থাগারের উপর নির্ভর করতে চাইনি বলে এটি দেওয়া হয়েছিল দেখে আমি আনন্দিত, তবে আমি লক্ষ্য করেছি যে একটি নিয়ন্ত্রণ চরিত্রের জন্য ডিফল্ট কেসটি সর্বদা "\\ u000X" ফিরে আসবে। আমি বিশ্বাস করি আপনার প্রথমে কোন আন্তঃনীতিতে চরটি castালাই করা দরকার। এর সাথে প্রতিস্থাপনের বিষয়টি বিবেচনা করুনstring t = "000" + ((int)c).ToString("X");
জানুয়ারী

সঠিক ডিফল্ট t = "000" + String.Format("{0:X}",(int) c);
কেসটি হ'ল

আমরা আসলে যা চাই তা হ'ল " "\\u" + ((int)c).ToString("X4") (যদিও আমি মনে করি দুটি সংযোজন আরও ভাল হবে)
জেমস কারান

16

আমি জেসনের স্ট্রিংয়ের মান এড়াতে নিম্নলিখিত কোডগুলি ব্যবহার করেছি। নিম্নলিখিত কোডের আউটপুটটিতে আপনাকে আপনার '' 'যুক্ত করতে হবে:

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();
}

4
এটি সত্যিই আমার দিনকে বাঁচিয়েছিল। অনেক ধন্যবাদ!
ক্যাসাউট

8
উত্পাদন এই কোড ব্যবহার করবেন না! এই JSON পলায়ন গুরুত্বপূর্ণ বিশেষ অক্ষর মিস করে characters দেখুন: stackoverflow.com/a/33799784
vog

4
এই কোডটি সমস্ত বিশেষ ক্ষেত্রে কভার করে না। উত্পাদন ব্যবহার করবেন না।
এনভিল

4
চাকাটি পুনরায় উদ্ভাবন করুন, এবং বিশেষ ক্ষেত্রে কিছু বাগ প্রবর্তন করা ভাল উত্তর নয়
Xilmiki

6

এখানে দেওয়া পদ্ধতিগুলি ত্রুটিযুক্ত।
আপনি যখন কেবল মাত্র 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();
    }
}

4

আমি উল্লিখিত জেএসওএন.এনইটি লাইব্রেরিটিও ব্যবহার করার পরামর্শ দেব , তবে ফলত জেএসওএন স্ট্রিংয়ে আপনাকে যদি ইউনিকোড অক্ষরগুলি (যেমন \ uXXXX ফর্ম্যাট) এড়াতে হয় তবে আপনাকে নিজেই এটি করতে হবে। উদাহরণস্বরূপ অ্যাস্কি স্ট্রিং থেকে পালাতে ইউনিকোড স্ট্রিংগুলিতে রূপান্তর করা একবার দেখুন ।


4

আমি দীর্ঘ উত্তর এবং একটি সংক্ষিপ্ত স্ট্রিংয়ের জন্য এই উত্তরগুলির কয়েকটিতে গতি পরীক্ষা চালিয়েছি। ক্লাইভ প্যাটারসনের কোড বেশ ভালভাবে জিতেছে, সম্ভবতঃ অন্যরা সিরিয়ালের বিকল্পগুলি বিবেচনা করছে। আমার ফলাফলগুলি এখানে:

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();
}




2

আমি খুব ভাল ওয়ান-লাইনার, অন্যদের মতো জসনকনভার্টকে ব্যবহার করেছি তবে যুক্ত উদ্ধৃতি এবং ব্যাকস্ল্যাশ সরিয়ে ফেলতে সাবস্ট্রিং যুক্ত করেছি।

 var escapedJsonString = JsonConvert.ToString(JsonString).Substring(1, JsonString.Length - 2);


0

আমি ব্যবহার করতে বেছে নিয়েছি 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)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.