কোনও ইউআরএল থাকতে জেএসএন স্ট্রিংটি কীভাবে এড়ানো যায়?


128

জাভাস্ক্রিপ্ট ব্যবহার করে, আমি কোনও পৃষ্ঠায় একটি লিঙ্ক তৈরি করতে চাই। পৃষ্ঠার পরামিতিগুলি জাভাস্ক্রিপ্ট অ্যারেতে রয়েছে যা আমি জেএসএন-এ সিরিয়ালাইজ করেছি।

সুতরাং আমি এর মতো একটি URL তৈরি করতে চাই:

http://example.com/?data="MY_JSON_ARRAY_HERE"

কোনও ইউআরএলটিতে প্যারামিটার হিসাবে অন্তর্ভুক্ত করার জন্য আমার কীভাবে JSON স্ট্রিং (অ্যারে সিরিয়ালাইজড) এড়ানোর দরকার?

JQuery ব্যবহার করে যদি কোনও সমাধান থাকে তবে আমি এটি পছন্দ করব।

দ্রষ্টব্য: হ্যাঁ, পৃষ্ঠার পরামিতিগুলিকে একটি অ্যারে থাকা প্রয়োজন কারণ সেগুলির অনেকগুলি রয়েছে। আমি মনে করি আমি পরে লিঙ্কগুলি সংক্ষিপ্ত করতে bit.ly ব্যবহার করব।


এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
w00t

উত্তর:


209
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
যদিও এটি প্রয়োজনীয়তার চেয়ে বেশি অক্ষর এনকোড করেছে (যখন আমি ফায়ারফক্সে লিঙ্কটি পেস্ট করব তখন কিছু অক্ষর আবার ফিরে যায় (যেমন {[") only কেবলমাত্র প্রয়োজনীয় অক্ষরগুলি এনকোড করার কোনও উপায় আছে যাতে আমি আমার ইউআরএলগুলি সংক্ষিপ্ত করতে পারি?
ম্যাথিউ নাপোলি

19

আপনি encodeURIComponentকোনও ক্যোয়ারী স্ট্রিংয়ের অংশ নিরাপদে URL এনকোড অংশগুলি ব্যবহার করতে পারেন :

var array = JSON.stringify([ 'foo', 'bar' ]);
var url = 'http://example.com/?data=' + encodeURIComponent(array);

অথবা আপনি যদি এজেএক্স অনুরোধ হিসাবে প্রেরণ করছেন:

var array = JSON.stringify([ 'foo', 'bar' ]);
$.ajax({
    url: 'http://example.com/',
    type: 'GET',
    data: { data: array },
    success: function(result) {
        // process the results
    }
});

19

আমি একই জিনিস করতে চেয়েছিলেন। আমার জন্য সমস্যাটি ছিল আমার ইউআরএল খুব দীর্ঘ পথে চলেছে। আমি আজ ব্রুনো জোহিরের jsUrl.js গ্রন্থাগারটি ব্যবহার করে একটি সমাধান পেয়েছি ।

আমি এখনও এটি খুব পুঙ্খানুপুঙ্খভাবে পরীক্ষা করে দেখিনি। তবে, এখানে 3 টি পৃথক পদ্ধতি ব্যবহার করে একই বৃহত অবজেক্টটি এনকোড করার পরে স্ট্রিং আউটপুটটির চরিত্রের দৈর্ঘ্য দেখানোর উদাহরণ রয়েছে:

  • 2651 অক্ষর ব্যবহার করে jQuery.param
  • 1691 টি অক্ষর ব্যবহার করে JSON.stringify + encodeURIComponent
  • 821 টি অক্ষর ব্যবহার করে JSURL.stringify

স্পষ্টত জেএসআরএল একটি জেএস অবজেক্টকে urlEncoding করার জন্য সর্বাধিক অনুকূলিত বিন্যাস রয়েছে।

https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q এ থ্রেডটি এনকোডিং এবং পার্সিংয়ের জন্য মানদণ্ড দেখায়।

দ্রষ্টব্য : পরীক্ষার পরে, দেখে মনে হচ্ছে jsurl.js গ্রন্থাগারটি ECMAScript 5 ফাংশন যেমন Object.keys, অ্যারে.ম্যাপ এবং অ্যারে.ফিল্টার ব্যবহার করে। অতএব, এটি কেবলমাত্র আধুনিক ব্রাউজারগুলিতে কাজ করবে (অর্থাত্ 8 এবং কম নয়)। যাইহোক, এই ফাংশনগুলির জন্য পলফিলগুলি এটি আরও ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ করে তুলবে।


0.1.4 যেহেতু এটি এখনও আইআই 6-8 এর সাথে সামঞ্জস্যপূর্ণ যদি আপনার এখনও প্রয়োজন হয়।
স্টোফ

8

ব্যবহার encodeURIComponent():

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),

5

আমি একটি বিজোড় বিকল্প প্রস্তাব করব। কখনও কখনও বিভিন্ন এনকোডিং ব্যবহার করা সহজ হয়, বিশেষত আপনি যদি এমন বিভিন্ন সিস্টেমের সাথে কাজ করছেন যা সমস্ত URL একইভাবে এনকোডিংয়ের বিশদটি পরিচালনা করে না। এটি সর্বাধিক মূলধারার পদ্ধতি নয় তবে কিছু পরিস্থিতিতে কার্যকর হতে পারে।

ডেটা ইউআরএল-এনকোডিংয়ের পরিবর্তে, আপনি এটিকে বেস 64-এনকোড করতে পারেন। এর সুবিধাটি হ'ল এনকোড হওয়া ডেটা খুব জেনেরিক, কেবলমাত্র আলফা অক্ষর এবং কখনও কখনও এর পিছনে থাকা =। উদাহরণ:

JSON অ্যারে অফ স্ট্রিং:

["option", "Fred's dog", "Bill & Trudy", "param=3"]

সেই ডেটা, ইউআরএল-পরম হিসাবে dataএনকোডড:

"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D"

একই, বেস 64-এনকোডড:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

বেস 64 অ্যাপ্রোচটি কিছুটা ছোট হতে পারে তবে আরও গুরুত্বপূর্ণ এটি সহজ। আমার প্রায়শই সিআরএল, ওয়েব ব্রাউজার এবং অন্যান্য ক্লায়েন্টদের মধ্যে ইউআরএল-এনকোডড ডেটা সরাতে সমস্যা হয় সাধারণত কোট, এম্বেড থাকা %চিহ্ন এবং এর কারণে । বেস 64 খুব নিরপেক্ষ কারণ এটি বিশেষ অক্ষর ব্যবহার করে না।


অবশেষে এখানে আমার বন্ধুর ঠিকানা (% 26) পাওয়া গেল (এবং)
প্রদীপ কুমার প্রবাহরান

বেস 64 এর স্ট্রিংগুলির সমস্যা হ'ল এগুলি স্ল্যাশ (/) অক্ষর ধারণ করতে পারে যা
ইউআরএলকে

এটি সত্য তবে আপনি বেস 64 ব্যবহার করতে অক্ষরগুলি চয়ন করতে পারেন: প্রতিস্থাপন করুন / সঙ্গে $, _বা অন্য কোন চরিত্র নেই বোঝায় যা RFC 3986. প্রতি URL এনকোডিং প্রয়োজন হয় না
ক্রিস জনসন

0

ডেলান প্রদত্ত উত্তর নিখুঁত। কেবল এটিতে যুক্ত করা - যদি কেউ প্যারামিটারগুলির নাম দিতে বা একাধিক জেএসএন স্ট্রিং আলাদাভাবে পাস করতে চায় - তবে নীচের কোডটি সহায়তা করতে পারে!

JQuery

var valuesToPass = new Array(encodeURIComponent(VALUE_1), encodeURIComponent(VALUE_2), encodeURIComponent(VALUE_3), encodeURIComponent(VALUE_4));

data = {elements:JSON.stringify(valuesToPass)}

পিএইচপি

json_decode(urldecode($_POST('elements')));

আশাকরি এটা সাহায্য করবে!


পিএইচপি comes _POST বা অন্য কোনও (জিইটি, রিকুয়েস্ট, ইত্যাদি) আসার জন্য ডেটার urldecode করার দরকার নেই। এখান থেকে আপনি যা করছেন তার উপর নির্ভর করে আপনি কোনও সুরক্ষা সমস্যার জন্য নিজেকে (এসকিউএল ইনজেকশন ইত্যাদি) খোলার চেষ্টা করছেন
টাইট পেট্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.