জেএসএন ইনফিনিটি এবং এনএএন ছাড়ল; ECMAScript এ JSON স্থিতি?


179

কোনও ধারণা কেন জেএসওএন NaN এবং +/- অনন্ততা ছেড়ে গেল? এটি জাভাস্ক্রিপ্টকে এমন এক অদ্ভুত পরিস্থিতিতে ফেলেছে যেখানে অন্যথায় সিরিয়ালযুক্ত হতে পারে এমন বস্তুগুলি যদি তাদের মধ্যে NaN বা +/- অসীম মান থাকে।

দেখে মনে হচ্ছে এটি পাথরে ফেলে দেওয়া হয়েছে: দেখুন RFC4627 এবং ECMA-262 (বিভাগটি 24.5.2, JSON.stringify, নোট 4, শেষ সম্পাদনায় ECMA-262 পিডিএফের পৃষ্ঠা 683):

সীমাবদ্ধ নম্বরগুলি কল করে যেমন স্ট্রাইফ করা হয় ToString(number)। সাইন নির্বিশেষে NaN এবং ইনফিনিটি স্ট্রিং হিসাবে উপস্থাপিত হয় null


আমি উভয় নথিতে সেই উদ্ধৃতিটি খুঁজে পাচ্ছি না।
উইজেডসবমারিনার

1
এটি ঠিক করা হয়েছে, দেখে মনে হচ্ছে কোনওরকম বাসি রেফারেন্স / বাসি সম্পাদনা ছিল।
জেসন এস

উত্তর:


90

Infinityএবং NaNকীওয়ার্ড বা বিশেষ কিছু নয়, এগুলি কেবলমাত্র বিশ্বব্যাপী বস্তুর (যেমন রয়েছে undefined) বৈশিষ্ট্য এবং যেমন পরিবর্তন করা যেতে পারে। এটি সেই কারণেই JSON তাদের অনুমানের সাথে অন্তর্ভুক্ত করে না - মূলত কোনও সত্য JSON স্ট্রিংয়ের একই ফলাফল যদি আপনি করেন eval(jsonString)বা ইকামাস্ক্রিপ্টে পাওয়া উচিত JSON.parse(jsonString)

যদি এটি অনুমোদিত হয় তবে কেউ কোডের মতোই ইনজেক্ট করতে পারে

NaN={valueOf:function(){ do evil }};
Infinity={valueOf:function(){ do evil }};

একটি ফোরামে (বা যাই হোক না কেন) এবং তারপরে সেই সাইটের কোনও জসন ব্যবহারের সাথে আপস করা যেতে পারে।


29
আপনি যদি 1/0 মূল্যায়ন করেন তবে আপনি ইনফিনিটি পাবেন, যদি আপনি -1/0 মূল্যায়ন করেন তবে আপনি ইনফিনিটি পাবেন, আপনি যদি 0/0 মূল্যায়ন করেন তবে আপনি এনএন পাবেন।
জেসন এস

9
তবে শর্তাদি NaNএবং Infinityসম্পত্তির নাম, সুতরাং স্ট্রিং (1/0) "Infinity"এমন একটি স্ট্রিং তৈরি করে যা মান অনন্তের স্ট্রিং প্রতিনিধিত্ব করে। আক্ষরিক মান ES হয় NaNবা Infinityহিসাবে উপস্থাপন করা সম্ভব নয় - আপনাকে হয় একটি এক্সপ্রেশন (উদাহরণস্বরূপ 1/0, 0/0 ইত্যাদি) বা একটি সম্পত্তি অনুসন্ধান ( Infinityবা উল্লেখ করে NaN) ব্যবহার করতে হবে। যেহেতু কোড সম্পাদন প্রয়োজন তাদের JSON এ অন্তর্ভুক্ত করা যাবে না।
ওলিজেজ

16
সুরক্ষা / সুরক্ষার বিষয়ে আপনার বক্তব্য অনুযায়ী, এনএএন রূপান্তর করতে গেলে সমস্ত শালীন জেএসওন পার্সারকে করতে হবে যখন 0N মান (প্রতীক NaN মূল্যায়নের পরিবর্তে) পাওয়া যাবে যা "আসল" নাএনকে ফিরিয়ে দেবে যাই হোক না কেন এনএএন প্রতীক হিসাবে নতুন সংজ্ঞা দেওয়া হয়।
জেসন এস

33
@ ওলিজেজ: আপনি যুক্তি দিয়েছিলেন যে এনএএন একটি আক্ষরিক নয়, জাভাস্ক্রিপ্ট শব্দার্থক বিচার করার পক্ষে আমি জাভাস্ক্রিপ্টকে যথেষ্ট জানিনা। তবে এমন একটি ফাইল ফর্ম্যাটের জন্য যা দ্বিগুণ নির্ভুলতা ভাসমান পয়েন্ট সংখ্যা সঞ্চয় করে, আইইইই ফ্লোটগুলি সংজ্ঞায়নের জন্য একটি উপায় থাকা উচিত, অর্থাৎ আক্ষরিক ন্যান / ইনফিনিটি / নেগি ইনফিনিটি দ্বারা। এগুলি bit৪ বিট ডাবলসের রাজ্য এবং সেগুলি উপস্থাপনযোগ্য হওয়া উচিত। এমন লোক আছে যারা তাদের উপর নির্ভর করে (কারণে)। এগুলি সম্ভবত ভুলে গিয়েছিল কারণ জেএসএন / জাভাস্ক্রিপ্টের উদ্ভব বৈজ্ঞানিক কম্পিউটিংয়ের পরিবর্তে ওয়েব বিকাশে হয়েছিল।
ওয়ার্লবেল

35
এটি 100%, একেবারে ভুল, জেএসওএনকে নির্বিচারে পুরোপুরি বৈধ এবং মানক ন্যাশনাল ইনফিনিটি এবং ইনফিনিটির স্ট্যান্ডার্ড ভাসমান-পয়েন্ট নম্বর রাজ্যের বাদ দেওয়া। মূলত, জেএসওএন আইইইই ফ্লোট মানগুলির একটি স্বেচ্ছাসেবক সাবসেটকে সমর্থন করার সিদ্ধান্ত নিয়েছে, অজ্ঞতাবশত তিনটি নির্দিষ্ট মান বাদ দেয় কারণ তারা শক্ত বা কিছু। না। ইভাল-ক্ষমতা এমনকি অজুহাত নয়, কারণ এই জাতীয় সংখ্যাগুলি আক্ষরিক 1/0, -1/0, এবং 0/0 হিসাবে এনকোড করা যেতে পারে। এগুলি "/ 0" এর সাথে যুক্ত বৈধ সংখ্যা হবে যা সনাক্তকরণের জন্য কেবল সহজ নয়, একই সাথে একই সময়ে ES হিসাবে মূল্যায়নযোগ্য। কোন ছুতা চলবে না.
ট্রায়ঙ্কো

55

মূল প্রশ্নে: আমি "সিবিয়ার" ব্যবহারকারীর সাথে একমত যে এটি জেএসএনে একটি দুর্ভাগ্যজনক ভুল। আইইইই 7575৫ এগুলি একটি ভাসমান পয়েন্ট সংখ্যাটির তিনটি বিশেষ মান হিসাবে সংজ্ঞায়িত করে। সুতরাং জেএসএন আইইইই 7575৫ ভাসমান পয়েন্ট সংখ্যাগুলি পুরোপুরি উপস্থাপন করতে পারে না। এটি বাস্তবে আরও খারাপ, যেহেতু JCON ECMA262 5.1 এ সংজ্ঞায়িত করা হয়েছে এমনকি এর সংখ্যাগুলি আইইইই 754 এর উপর ভিত্তি করে কিনা তাও নির্ধারণ করে না। ECMA262 এ স্ট্রিংফাই () ফাংশনটির জন্য বর্ণিত নকশার প্রবাহ যেহেতু তিনটি বিশেষ আইইইই মানগুলির উল্লেখ করে, তাই কেউ সন্দেহ করতে পারেন যে উদ্দেশ্যটি আসলে আইইইই 754 ভাসমান পয়েন্ট সংখ্যা সমর্থন করার ছিল।

অন্য একটি ডেটা পয়েন্ট হিসাবে, প্রশ্নের সাথে সম্পর্কিত নয়: এক্সএমএল ডেটাটাইপস এক্স: ফ্লোট এবং এক্স: ডাবল ডেট করুন যে তারা আইইইই 75৫৪ ভাসমান পয়েন্ট সংখ্যার ভিত্তিতে রয়েছে এবং তারা এই তিনটি বিশেষ মানের প্রতিনিধিত্বকে সমর্থন করে (ডাব্লু 3 সি এক্সএসডি 1.0 পার্ট 2 দেখুন) , তথ্যের ধরণ).


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

5
@ অ্যাড্রিয়ানরত্নপালা +1 প্রকৃতপক্ষে: জেএসএন সংখ্যার সম্ভাব্য অসীম নির্ভুলতা রয়েছে, তাই আইইইই নির্দিষ্টকরণের চেয়ে অনেক ভাল, কারণ তাদের কোনও আকারের সীমা নেই, নির্ভুলতার সীমা নেই এবং কোনও গোলাকার প্রভাব নেই (যদি সিরিয়ালটি এটি পরিচালনা করতে পারে) izer
আরনাউড বোচেজ

2
@ArnaudBouchez। এটি বলেছিল, জেএসএনের এখনও NaN এবং + -Infinity প্রতিনিধিত্ব করে স্ট্রিং সমর্থন করা উচিত। এমনকি জেএসওএনকে কোনও আইইইই ফর্ম্যাটে পিন না করা উচিত, সংখ্যার ফর্ম্যাট সংজ্ঞায়িত করা লোকদের কমপক্ষে উইকিপিডিয়া পৃষ্ঠা আইইইই 7575৫ দেখুন এবং ভাবতে কিছুক্ষণ থামিয়ে দেওয়া উচিত।
অ্যাড্রিয়ান রত্নপালা


এটি দুর্ভাগ্যজনক নয়। উত্তরটি সার্ভেড দ্বারা দেখুন। এটি আইইই 75৫৪ এর সাথে আবদ্ধ নয় যা একটি ভাল জিনিস (এমনকি বেশিরভাগ প্রোগ্রামিং ভাষাতে আইইইই 75৫৪ ব্যবহার করা হয় এবং এটি এনএএন ইত্যাদির জন্য অতিরিক্ত প্রসেসিংয়ের প্রয়োজন হয়)।
লুডোভিচ কিউটি

16

আপনি নাল বস্তুর প্যাটার্নটি খাপ খাইয়ে নিতে পারবেন এবং আপনার জেএসওএন এ যেমন মানগুলি উপস্থাপন করে

"myNum" : {
   "isNaN" :false,
   "isInfinity" :true
}

তারপরে চেক করার সময়, আপনি টাইপটি পরীক্ষা করতে পারেন

if (typeof(myObj.myNum) == 'number') {/* do this */}
else if (myObj.myNum.isNaN) {/* do that*/}
else if (myObj.myNum.isInfinity) {/* Do another thing */}

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


1
হুমমম ... এটি একটি কার্যবিধির উত্তর; আমি প্রকৃতপক্ষে কোনও কাজের জন্য জিজ্ঞাসা করছিলাম না বরং কেন এই মানগুলি বাদ দিচ্ছে। তবে যাইহোক +1 করুন।
জেসন এস

2
@ জোয়েডবার্গ: কোনও মূলশব্দ undefinedনয়, এটি বিশ্বব্যাপী একটি
সামগ্রীতে

2
@ জোয়েডবার্গ: অপরিজ্ঞাত হ'ল বিশ্বব্যাপী একটি সম্পত্তি - এটি কোনও কীওয়ার্ড নয়, তাই "undefined" in thisবিশ্বব্যাপী সুযোগে সত্য ফিরে আসে। এর অর্থ হ'ল আপনি করতে পারবেন undefined = 42এবং if (myVar == undefined)হয়ে উঠবেন (মূলত) myVar == 42। এটি বাস্তবে স্ক্রিপ্ট নিউ জাভাস্ক্রিপ্টের প্রথম দিনগুলিতে ফিরে আসে যেখানে undefinedডিফল্টরূপে অস্তিত্ব ছিল না, তাই লোকেরা কেবল var undefinedবিশ্বব্যাপী সুযোগ তৈরি করেছিল। ফলস্বরূপ undefinedবিদ্যমান সাইটগুলি না ভাঙিয়ে কোনও কীওয়ার্ড তৈরি করা যায়নি, এবং তাই আমরা সাধারণ সম্পত্তি হিসাবে অপরিবর্তিত থাকার জন্য সর্বকালের জন্য ডুমড হয়ে গিয়েছিলাম।
oliiej

2
@ এলিয়েজ: আপনি কেন অপরিবর্তিত বলে মনে করেন বিশ্বব্যাপী কোনও সামগ্রীর সম্পত্তি I ডিফল্টরূপে অপরিজ্ঞাত বর্ণনাকে অপরিজ্ঞাপিতের অন্তর্নির্মিত মান। যদি আপনি এটিকে "অপরিবর্তিত = 42" দিয়ে ওভাররাইড করে থাকেন তবে আপনি যখন ভেরিয়েবল লুপ হিসাবে অপরিজ্ঞাত অ্যাক্সেস করেন তখন আপনি ওভাররাইড মানটি পাবেন। তবে "zz = অপরিজ্ঞাত; অপরিবর্তিত = 42; x = {}; 'অপরিজ্ঞাতকৃত পুরানো =' + (এক্সএ === জেডজেট) + ', অপরিবর্তিত নতুন =' + (xa === অপরিশোধিত) করার চেষ্টা করুন। আপনি কখনই নাল, অপরিজ্ঞাত, এনএএন বা ইনফিনিটির অভ্যন্তরীণ মানগুলি পুনরায় সংজ্ঞায়িত করতে পারবেন না, এমনকি যদি আপনি তাদের প্রতীক অনুসন্ধানগুলি ওভাররাইড করতে পারেন।
জেসন এস

2
@ জেসন undefinedএকটি বিশ্বব্যাপী সম্পত্তি কারণ এটি নির্দিষ্ট হিসাবে নির্দিষ্ট করা হয়েছে। ECMAScript-262 তৃতীয় সংস্করণের 15.1.1.3 এর সাথে পরামর্শ করুন।
কঙ্গাক্স

11

স্ট্রিংস "ইনফিনিটি", "-ইনফিনিটি" এবং "এনএএন" সমস্ত জেএসের প্রত্যাশিত মানগুলিকে বাধ্য করে। সুতরাং আমি যুক্তি দিয়েছি যে JSON এ এই মানগুলি উপস্থাপনের সঠিক উপায় স্ট্রিং হিসাবে।

> +"Infinity"
Infinity

> +"-Infinity"
-Infinity

> +"NaN"
NaN

এটি কেবল লজ্জাজনক JSON.stringify ডিফল্টরূপে এটি করে না। কিন্তু, একটি উপায় আছে:

> JSON.stringify({ x: Infinity }, function (k,v) { return v === Infinity ? "Infinity" : v; })
"{"x":"Infinity"}"

1
0/0, ইত্যাদি বৈধ JSON নয়। আপনাকে স্ট্যান্ডার্ডের সীমার মধ্যে কাজ করতে হবে, এবং স্ট্রিংগুলি সুন্দরভাবে কাজটি করবে।
teh_senaus

বিপরীতে, আমি মনে করি এটিই একমাত্র ব্যবহারিক সমাধান, তবে আমি এমন একটি ফাংশন করব যা NaN ফিরিয়ে দেয় যদি ইনপুট মান "NaN" হয় ইত্যাদি you
মার্কো সুলা

3
জেএসওএন মানগুলি পাটিগণিতের বহিঃপ্রকাশ হতে পারে না ... ভাষাটি আক্ষরিক বাক্য গঠন থেকে স্ট্যান্ডার্ডকে আলাদা করার লক্ষ্য হ'ল এটিকে কোনও কোড হিসাবে কার্যকর না করেই জেএসওএনকে ডিজাইরিয়ালাইজেবল করে তোলা। নিশ্চিত নন কেন আমরা হতে পারে না NaNএবং Infinityমত শব্দ মান হিসেবে যোগ trueএবং false, যদিও।
মার্ক রিড

এটি আরো স্পষ্ট, আমরা ব্যবহার করতে পারেন করা Number("Infinity"), Number("-Infinity")এবংNumber("NaN")
HKTonyLee

এটি ম্যাজিকের মতো কাজ। JSON.parse("{ \"value\" : -1e99999 }")সহজে { value:-Infinity }জাভাস্ক্রিপ্ট ফিরে । কেবল এটি কেবলমাত্র কাস্টম সংখ্যার প্রকারের সাথেই উপযুক্ত নয় যা এর চেয়েও বড় হতে পারে
থাইনা

7

যদি আপনার ক্রমিক কোডটিতে অ্যাক্সেস থাকে তবে আপনি ইনফিনিটি 1.0e + 1024 হিসাবে উপস্থাপন করতে পারেন। ডাবল হিসাবে উপস্থাপনের জন্য ব্যাক্তিটি খুব বড় এবং যখন ডিসিরিয়ালাইজ করা হয় তখন এটি অনন্ত হিসাবে উপস্থাপিত হয়। ওয়েবকিটে কাজ করে, অন্যান্য জসন পার্সার সম্পর্কে অনিশ্চিত!


4
আইইইই 754 128 বিট ভাসমান পয়েন্ট সংখ্যা সমর্থন করে তাই 1.0e5000 আরও ভাল
টন প্লম্প

2
টন: 128 বিট পরে যুক্ত করা হয়েছে। তারা যদি 256 বিট যুক্ত করার সিদ্ধান্ত নেয়? তারপরে আপনাকে আরও শূন্য যুক্ত করতে হবে এবং বিদ্যমান কোডটি অন্যরকম আচরণ করবে। Infinityসর্বদা থাকবে Infinity, তবে কেন সমর্থন করবেন না?
উড়ন্ত ভেড়া

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

3
1, -1, এবং 0 ..... পুরোপুরি বৈধ / পার্সেবল সংখ্যাগুলি, যখন আপনি কেবল /0তাদের শেষের দিকে যুক্ত করেন তখন এই তিনটি বিশেষ মান হয়ে যায়। এটি সহজেই পার্সেবল, তাত্ক্ষণিকভাবে দৃশ্যমান এবং এমনকি মূল্যায়নযোগ্য। এটি অবর্ণনীয় যে তারা এখনও এটি স্ট্যান্ডার্ডের সাথে যোগ করেনি: {"Not A Number":0/0,"Infinity":1/0,"Negative Infinity":-1/0} << কেন নয়? alert(eval("\"Not A Number\"") //works alert(eval("1/0")) //also works, prints 'Infinity'। কোন ছুতা চলবে না.
ট্রায়ঙ্কো


1

দশমিক 64৪-বিট ভাসমান-পয়েন্ট টাইপ এবং একটি বাইনারি -৪-বিট ভাসমান-পয়েন্ট টাইপ: বর্তমান আইইইইএস স্ট্যান্ড 754-2008 এ দুটি পৃথক 64-বিট ফ্লোটিং-পয়েন্ট উপস্থাপনের সংজ্ঞা রয়েছে।

স্ট্রিং rounding পর .99999990000000006হিসাবে একই .9999999আইইইই বাইনারি 64-বিট প্রতিনিধিত্ব কিন্তু এটা না হিসাবে একই .9999999আইইইই দশমিক 64-বিট প্রতিনিধিত্ব। -৪-বিট আইইইইই দশমিক ভাসমান-পয়েন্টের .99999990000000006রাউন্ডে .9999999000000001যা দশমিক .9999999মানের হিসাবে একই নয় ।

যেহেতু JSON কেবলমাত্র দশমিক সংখ্যার স্ট্রিং হিসাবে সংখ্যার মানগুলি বিবেচনা করে যে কোনও আইইইই বাইনারি এবং দশমিক ফ্লোটিং-পয়েন্ট উপস্থাপনা (যেমন আইবিএম পাওয়ার) উভয়কে সমর্থন করে এমন কোনও সিস্টেমের পক্ষে উপায় নেই যা দুটি সম্ভাব্য আইইইই সংখ্যাসূচক ভাসমান-পয়েন্টের মানগুলি নির্ধারণ করতে পারে অভিপ্রেত.


এই প্রশ্নের সাথে কী করার আছে? (যা ইনফিনিটি এবং এনএএনএন সম্পর্কে)
ব্রায়ান

1

Key "কী" এর মতো মামলার সম্ভাব্য কাজ: অসীমতা:

JSON.parse(theString.replace(/":(Infinity|-IsNaN)/g, '":"{{$1}}"'), function(k, v) {
   if (v === '{{Infinity}}') return Infinity;
   else if (v === '{{-Infinity}}') return -Infinity;
   else if (v === '{{NaN}}') return NaN;
   return v;
   });

সাধারণ ধারণাটি হ'ল অবৈধ মানগুলির উপস্থিতিগুলিকে একটি স্ট্রিংয়ের সাথে প্রতিস্থাপন করা যা পার্স করার সময় আমরা স্বীকৃত করব এবং এটিকে যথাযথ জাভাস্ক্রিপ্ট উপস্থাপনার সাথে প্রতিস্থাপন করব।


আমি জানি না কেন এই সমাধানটি ডাউনভোটটি পেয়েছিল কারণ প্রকৃতপক্ষে, আপনি যদি এমন কোনও পরিস্থিতির মুখোমুখি হন যেখানে আপনার JSON স্ট্রিংটিতে ইনফিনিটি বা ইসনন মান রয়েছে তবে যখন আপনি এটি বিশ্লেষণ করার চেষ্টা করবেন তখন এটি ব্যর্থ হবে। এই কৌশলটি ব্যবহার করে, আপনি প্রথমে ইসএনএএনএন বা ইনফিনিটির ঘটনাগুলি অন্য কোনও কিছুর সাথে প্রতিস্থাপন করুন (যে কোনও বৈধ স্ট্রিং যা এই শর্তাদি থাকতে পারে সেগুলি থেকে বিচ্ছিন্ন করতে) এবং সঠিক, বৈধ জাভাস্ক্রিপ্ট মানগুলি ফিরে পেতে JSON.parse (স্ট্রিং, কলব্যাক) ব্যবহার করুন। আমি এটি প্রোডাকশন কোডে ব্যবহার করছি এবং কখনও কোনও সমস্যা হয়নি।
শামেল

এই স্ট্রিং ভিতরে অনন্ত গোলযোগ না? অনেকগুলি ব্যবহারের ক্ষেত্রে এটি ধরে নেওয়া সম্ভবত নিরাপদ যে এটি কোনও সমস্যা নয় তবে সমাধানটি পুরোপুরি শক্ত নয়।
ওলেজোরেনব

1

কারণটি স্ট্যান্ডার্ড ইসিএমএ -404 পৃষ্ঠাতে উল্লেখ করা হয়েছে জেএসএন ডেটা ইন্টারচেঞ্জ সিনট্যাক্স, প্রথম সংস্করণ

JSON সংখ্যা সম্পর্কে অজ্ঞেয়। যে কোনও প্রোগ্রামিং ভাষায়, বিভিন্ন ধরণের বিভিন্ন ক্ষমতা এবং পরিপূরক, স্থির বা ভাসমান, বাইনারি বা দশমিক can যা বিভিন্ন প্রোগ্রামিং ভাষার মাঝে আন্তঃ বিনিময় করতে পারে। JSON পরিবর্তে কেবলমাত্র সংখ্যার প্রতিনিধিত্ব করে যা মানুষ ব্যবহার করে: সংখ্যার ক্রম। সমস্ত প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি অভ্যন্তরীণ উপস্থাপনায় একমত না হলেও কীভাবে ডিজিটিক সিক্যুয়েন্সটি বোঝায় তা জানে। বিনিময় অনুমতি দেওয়ার জন্য এটি যথেষ্ট।

ইসিএমএ স্ক্রিপ্টের উপস্থাপনা NaNএবং কারণগুলির কারণে অনেকে দাবি করেছেন না is Infinityসরলতা JSON এর একটি মূল নকশার নীতি।

যেহেতু এটি খুব সহজ, এটি কখনই জেএসএন ব্যাকরণ পরিবর্তিত হবে বলে আশা করা যায় না। এটি জেএসওএনকে একটি ফাউন্ডেশনাল স্বরলিপি হিসাবে প্রচুর স্থায়িত্ব দেয়


-3

আমার মতো যদি সিরিয়ালাইজেশন কোডের উপর আপনার কোনও নিয়ন্ত্রণ না থাকে তবে আপনি এনএএন মানগুলি নাল বা অন্য কোনও মান দ্বারা একটি হ্যাকের মতো কিছুটা প্রতিস্থাপন করে নীচের সাথে ডিল করতে পারেন:

$.get("file.json", theCallback)
.fail(function(data) {
  theCallback(JSON.parse(data.responseText.replace(/NaN/g,'null'))); 
} );

সংক্ষেপে, আসল জসন পার্সার যখন একটি অবৈধ টোকেন সনাক্ত করে তখন .fail কল হবে। তারপরে অবৈধ টোকেনগুলি প্রতিস্থাপন করতে স্ট্রিং প্রতিস্থাপন ব্যবহার করা হবে। আমার ক্ষেত্রে এটি সিরিয়ানাইজারের জন্য NaN মানগুলি ফিরিয়ে নেওয়া ব্যতিক্রম তাই এই পদ্ধতিটি সর্বোত্তম পন্থা। যদি ফলাফলগুলিতে সাধারণত অবৈধ টোকেন থাকে তবে আপনি get .get ব্যবহার না করে বরং JSON ফলাফলটি ম্যানুয়ালি পুনরুদ্ধার করা এবং সর্বদা স্ট্রিং প্রতিস্থাপন চালানো ভাল।


21
চালাক, তবে পুরোপুরি বোকা নয়। এটি দিয়ে চেষ্টা করুন{ "tune": "NaNaNaNaNaNaNaNa BATMAN", "score": NaN }
জেজেজে

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