জেএসনে, প্রতিটি নাম কেন উদ্ধৃত করা হয়?


91

জেএসওএন স্পেক বলছে যে জেএসওএন একটি বস্তু বা অ্যারে। কোনও বস্তুর ক্ষেত্রে,

কোনও বস্তুর কাঠামো শূন্য বা আরও বেশি নাম / মান জোড়া (বা সদস্য) এর চারপাশে কোঁকড়ানো বন্ধনীগুলির এক জোড়া হিসাবে উপস্থাপিত হয়। একটি নাম একটি স্ট্রিং। ...

এবং পরে, অনুমানটি বলে যে একটি স্ট্রিং চারদিকে উদ্ধৃতিযুক্ত।

কেন?

এইভাবে,

{"Property1":"Value1","Property2":18}

এবং না

{Property1:"Value1",Property2:18}

প্রশ্ন 1 : কেন নাম / মান জোড়ের নামটিকে অনুপযুক্ত শনাক্তকারী হতে দেওয়া হচ্ছে না?


প্রশ্ন 2 : জাভাস্ক্রিপ্টে যখন মূল্যায়ন করা হয় তখন উপরের দুটি উপস্থাপনার মধ্যে কি সিনেমিক পার্থক্য রয়েছে?


4
@ ব্রুনো: আপনি এক্সএমএল সম্পর্কেও একইভাবে কথা বলতে পারেন ... এবং দুঃখের বিষয়, কেউ কেউ এক্সএমএলকে একটি প্রোগ্রামিং ভাষা হিসাবে ব্যবহার করার চেষ্টা করতে পারেন ...
মাইক ডিসিমোন

4
+1 ... এটি একটি অদ্ভুত বৈপরীত্যের মতো বলে মনে হচ্ছে .... "কোটস সহ" এটি স্ট্যান্ডার্ড জেএসওএন তৈরি করে, তবে eval()(যেমন জাভাস্ক্রিপ্ট) দিয়ে কাজ করবে না ।
স্কেফম্যান

4
@ ব্রুনো, না আপনি যদি এটি প্রসারিত করেন তবে এটি "জাভাস্ক্রিপ্ট অবজেক্ট নোটেশনে" হয়ে যায় যা ভাল
ডেভ আর্চার

4
@ স্কাফম্যান - জাভাস্ক্রিপ্ট-এ প্রকাশিত হলে এটি কাজ করবে।
কোয়ান্টিন

4
@ ব্রুনো - জেএসএন একটি ডেটা ফর্ম্যাট। "ইন জেএসএন" এর অর্থ - স্পেক অনুসারে ডেটা ফর্ম্যাট করা।
চিজো

উত্তর:


57

প্রশ্ন 1: কেন নাম / মান জোড়ের নামটিকে অনুপযুক্ত শনাক্তকারী হতে দেওয়া হচ্ছে না?

জেএসএনের নকশা দর্শনটি "এটিকে সহজ রাখুন" is

"উক্ত নামগুলির সাথে "" এর তুলনায় অনেক সহজ "আপনি নামগুলির সাথে উদ্ধৃতি দিতে পারেন "বা 'আপনার করতে হবে না, যদি না সেগুলিতে নির্দিষ্ট অক্ষর (বা অক্ষরগুলির সংমিশ্রণ যা এটি একটি মূলশব্দ হিসাবে তৈরি করে) এবং 'বা "নির্ভর করে উদ্ধৃতি দেওয়ার প্রয়োজন হতে পারে আপনি কোন সীমানার নির্বাচন করেছেন "তার উপর

প্রশ্ন 2: জাভাস্ক্রিপ্টে যখন মূল্যায়ন করা হয় তখন উপরের দুটি উপস্থাপনার মধ্যে কি সিনেমিক পার্থক্য রয়েছে?

না। জাভাস্ক্রিপ্ট এ তারা অভিন্ন।


4
না এটি সঠিক নয়। সিএমএসের সঠিক উত্তর রয়েছে। এই উত্তরটি আসল কারণটির একটি দুর্দান্ত পার্শ্ব-প্রতিক্রিয়া। ব্যাখ্যা করতে সহজ হওয়া ছাড়াও, পার্সার লিখতে এটি আরও সহজ, যেহেতু আপনি শনাক্তকারীদের স্ট্রিংয়ের জন্য পার্স বিধিগুলি পুনরায় ব্যবহার করতে পারেন।
ব্রেটন

এবং সেগুলি বাদ দিয়ে, এর মধ্যে কিছুটা অর্থপূর্ণ পার্থক্য রয়েছে যদি কোনও সনাক্তকারী যদি কোনও সংরক্ষিত শব্দ হয়ে থাকে, তবে এটি শব্দের সাথে শনাক্তকারী হিসাবে বর্ণিত হবে না।
ব্রেটন

4
সিএমএসের উত্তরে +1, এটি সঠিক। ডাবল উদ্ধৃতিগুলি কোনও কোড কনভেনশন নয়, তবে আপনি অবজেক্টের কী হিসাবে সংরক্ষিত শব্দগুলি এড়াতে চান। উদাহরণস্বরূপ: {সম্পত্তি1: "abc", এটি: "Def" W হ'ল ভুল (এটি একটি সংরক্ষিত কীওয়ার্ড)
সোরিন মোকানু

প্রশ্ন 2 : জাভাস্ক্রিপ্ট মধ্যে একটি ছোট পার্থক্য যখন ব্যবহার JSON.parseফাংশন: JSON.parse('{"a":1}') ভাল কাজ করে , কেন JSON.parse('{a:1}')করবে একটি ব্যতিক্রম বাড়াতে
nhnghia

@ হংসহিয়া - প্রশ্ন 2টি জেএসএসন নয়, উত্স কোডটি জাভাস্ক্রিপ্ট হিসাবে মূল্যায়নের বিষয়ে । JSON.parseজাভাস্ক্রিপ্টে প্রয়োগ করা একটি জেএসএন পার্সার, এটি কোনও জাভাস্ক্রিপ্ট পার্সার নয়।
কোয়ান্টিন

134

ডগলাস ক্রকফোর্ড (জেএসএন স্ট্যান্ডার্ডের স্রষ্টা) ইয়াহুকে যে উপস্থাপনা দিয়েছিলেন তার একটি উদ্ধৃতি আমি রেখেছি।

তিনি কীভাবে তিনি জেএসএনকে আবিষ্কার করেছিলেন এবং অন্যান্য বিষয়গুলির মধ্যে কেন তিনি উদ্ধৃত কীগুলি ব্যবহার করার সিদ্ধান্ত নিয়েছেন তা সম্পর্কে আলোচনা করেছেন :

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

এই সময়, আমি লোকদের বোঝানোর চেষ্টা করছিলাম: হ্যাঁ, আপনি জাভাস্ক্রিপ্টে অ্যাপ্লিকেশন লিখতে পারেন, এটি আসলে কাজ করছে এবং এটি একটি ভাল ভাষা। তখন আমি একই সাথে বলতে চাইনি: এবং তারা যা করেছে তা সত্যিই বোকামির দিকে তাকান! সুতরাং আমি স্থির করেছিলাম, পরিবর্তে, আসুন কেবল কীগুলি উদ্ধৃত করব।
এইভাবে, এটি কতটা খারাপ তা সম্পর্কে আমাদের কাউকে বলার দরকার নেই।

এই কারণেই, আজ পর্যন্ত, কীগুলি জেএসএনে উদ্ধৃত হয়েছে।

আপনি এখানে সম্পূর্ণ ভিডিও এবং প্রতিলিপি খুঁজে পেতে পারেন ।


উম্মম ... জেএসএন স্ট্যান্ডার্ডের স্রষ্টা ?! আমি বিশ্বাস করি যে এটি একটি অতিমাত্রায় কাজ। জেএসএন হ'ল জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন এবং এটি জাভাস্ক্রিপ্ট (ইসিএমএ) স্পেস থেকে এসেছে।
সোরিন মোকানু

42
@ সোরিন: জেএসএসনকে জাভাস্ক্রিপ্ট অবজেক্ট আক্ষরিক সাথে বিভ্রান্ত করবেন না। জেএসএন হ'ল একটি ভাষা-অজ্ঞাত ডেটা ইন্টারচেঞ্জ ফর্ম্যাট, যা ক্রোকফোর্ড 2006 সালে প্রস্তাব করেছিলেন (সরঞ্জাম. ietf.org/html/rfc4627 ), এর ব্যাকরণটি জাভাস্ক্রিপ্ট অবজেক্ট ল্যাটারালগুলি থেকে পৃথক হয়েছে ( সারণি /200200 / 11/07/#a-11.1 .5 ), মূলত শুধুমাত্র অনুমতি দিয়ে স্ট্রিং কী ও মান হবে একটি হতে বস্তুর , অ্যারে , সংখ্যা , স্ট্রিং বা নিম্নলিখিত আক্ষরিক নামের এক: মিথ্যা , নাল সত্য । জাভাস্ক্রিপ্টে অবজেক্ট লিটারেলের আইডেন্টিফায়ার , স্ট্রিং লিটারেল বাসংখ্যা আক্ষরিক , এবং মান যে কোনও ধরণের অভিব্যক্তি হতে পারে ...
খ্রিস্টান সি সালভাদে

@ সিএমএস এবং আজকের জাভাস্ক্রিপ্ট শর্টহ্যান্ড শনাক্তকারীদের অবজেক্ট কনস্ট্রাক্টর এক্সপ্রেশনগুলির ভিতরে অনুমতি দেয়, উদাহরণস্বরূপ: { a }যেখানে সম্পত্তি 'এ' একটি গ্লোবাল বা স্থানীয় ভেরিয়েবলের 'ক' এর মান অনুলিপি করে।
হাইড্রোপার

@CMS সেই সময় নির্ণিত এর কী-সমূহ:{[key]: value}
Hydroper

0

:শনাক্তকারীদের উভয় এবং সাদা স্থান অনুমোদিত ace উদ্ধৃতি ব্যতীত, শনাক্তকারীকে ঠিক কী গঠন করে তা নির্ধারণের চেষ্টা করার সময় এটি দ্ব্যর্থহীনতার কারণ হতে পারে।


0

জাভাস্ক্রিপ্টে অবজেক্টগুলি কী-জোড়গুলির সাথে হ্যাশ / হ্যাশ টেবিলের মতো ব্যবহার করা যেতে পারে।

তবে আপনার কীতে যদি এমন অক্ষর থাকে যা জাভাস্ক্রিপ্ট একটি নাম হিসাবে টোকানাইজ করতে না পারে তবে এটি কোনও কী-এর চেয়ে কোনও বস্তুর উপর সম্পত্তি হিসাবে অ্যাক্সেস করার চেষ্টা করার সময় ব্যর্থ হয়।

var test  = {};
test["key"] = 1;
test["#my-div"] = "<div> stuff </div>";

// test = { "key": 1, "#my-div": "<div> stuff </div>" };

console.log(test.key);           // should be 1
console.log(test["key"]);        // should be 1
console.log(test["#my-div"]);    // should be "<div> stuff </div>";
console.log(test.#my-div);       // would not work.

সনাক্তকারীদের মাঝে মাঝে এমন অক্ষর থাকতে পারে যা জাভাস্ক্রিপ্টে টোকেন / আইডেন্টিফায়ার হিসাবে মূল্যায়ন করা যায় না, সুতরাং ধারাবাহিকতার জন্য সমস্ত শনাক্তকারীকে স্ট্রিংগুলিতে রাখাই সেরা।


-2

আমি মনে করি চিসোর প্রশ্নের সঠিক উত্তর হ'ল বাস্তবায়ন ডকুমেন্টেশনকে ছাড়িয়ে গেছে। এর আর চাবি হিসাবে স্ট্রিংয়ের দরকার নেই, বরং অন্য কিছু, যা স্ট্রিং (যেমন উদ্ধৃত) বা (সম্ভবত) এমন কিছু হতে পারে যা ভেরিয়েবল নাম হিসাবে ব্যবহার করা যেতে পারে, যার অনুমান আমি একটি অক্ষর দিয়ে শুরু করব, _ , বা $, এবং কেবলমাত্র অক্ষর, সংখ্যা এবং $ এবং _ অন্তর্ভুক্ত করে।

আমি পরবর্তী ব্যক্তির যারা এই প্রশ্নটি আমার একই ধারণাটি দিয়ে দেখে তার জন্য বাকীটি সরল করতে চেয়েছিলাম। মাংস এখানে:

যখন কোনও অবজেক্ট কী হিসাবে ব্যবহার করা হয় তখন ভেরিয়েবলের নামগুলি JSON এ অন্তর্ভুক্ত হয় না (ধন্যবাদ ফ্রেডো!)

ব্রেটান, "কী" এর পরিবর্তে "সনাক্তকারী" ব্যবহার করে লিখেছিলেন যে "যদি কোনও সনাক্তকারী কোনও সংরক্ষিত শব্দ হয়ে থাকে তবে এটি শব্দের সাথে শনাক্তকারী হিসাবে ব্যাখ্যা করা হবে না।" এটি সত্য হতে পারে তবে আমি কোনও ঝামেলা ছাড়াই চেষ্টা করেছি:

var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7};
a.break

=> 6

উদ্ধৃতি ব্যবহার সম্পর্কে, কোয়ান্টিন লিখেছেন "... তবে [কী-তে] নির্দিষ্ট অক্ষর না থাকলে (বা অক্ষরগুলির সংমিশ্রণ যা এটি একটি মূলশব্দ হিসাবে তৈরি করে)"

আমি দেখতে পেয়েছি পূর্ববর্তী অংশটি (নির্দিষ্ট অক্ষরগুলি) সত্য, @ চিহ্ন ব্যবহার করে (আসলে, আমি মনে করি $ এবং _ কেবলমাত্র অক্ষর যা ত্রুটির কারণ না করে):

var a = {a@b:1};

=> সিনট্যাক্স ত্রুটি

var a = {"a@b":1};
a['a@b']

=> ১

তবে কীওয়ার্ড সম্পর্কে প্যারেন্টিথিকাল, যেমন আমি উপরে দেখিয়েছি, সত্য নয়।

আমি যা চাইছিলাম তা কাজ করে কারণ প্রারম্ভিক {এবং কোলনের মধ্যে, বা পরবর্তী বৈশিষ্ট্যগুলির জন্য কমা এবং কোলনের মধ্যে লেখাটি কোনও অবজেক্টের কী তৈরি করতে অব্যক্ত স্ট্রিং হিসাবে ব্যবহৃত হয়, বা ফ্রেডো যেমন লিখেছে, সেখানে একটি ভেরিয়েবলের নাম নেই টি বিভক্ত করা:

var uid = getUID();
var token = getToken();            // Returns ABC123
var data = {uid:uid,token:token};
data.token

=> এবিসি 123


-3

যদি জেসন বস্তুগুলি বর্ণনা করে তবে অনুশীলনে আপনি নিম্নলিখিতটি পান

var foo = {};

var bar = 1;

foo["bar"] = "hello";
foo[bar] = "goodbye";

তাহলে,

foo.bar == "hello";
foo[1] == "goodbye" // in setting it used the value of var bar

সুতরাং যদি আপনার উদাহরণগুলি একই ফল দেয় তবে তাদের "কাঁচা কোড" এর সমতুল্য হয় না। হয়তো তাই কেন ?? ঠিক আছে, একটি ধারণা।


4
@ ডেভিড, ভেরিয়েবলের নামগুলি যখন কোনও অবজেক্ট কী হিসাবে ব্যবহৃত হয় তখন জেএসে ইন্টারপোল্ট হয় না। { bar: 'goodbye' }মানটির মূল নামটি সেট করবে না bar, এটি ঠিক হবে bar। অন্যরা কেন স্পেকের উদ্ধৃতি প্রয়োজন তার কারণ সম্পর্কে সঠিক: এটি কীওয়ার্ড এবং বিশেষ-চরিত্রের দ্বন্দ্ব এড়ানো।
ফ্রেডো

-3

যদি প্রয়োজনে কেবলমাত্র নামগুলিতে উদ্ধৃতিগুলি অনুমোদিত হয় তবে এটি ডেটার আকার হ্রাস করতে পারে

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