এটি JSON ফলাফলের কার্যকারিতা সংজ্ঞায়িত করার জন্য বৈধ?


98

একটি ওয়েবসাইটের জেএসওএন প্রতিক্রিয়ার অংশটিতে এটি ছিল ... (প্রসঙ্গে যোগ করা হয়েছে):

{..., now:function(){return(new Date).getTime()}, ...}

JSON এ বেনাম ফাংশন যুক্ত করা বৈধ? আমি আশা করব প্রতিবার আপনি যখন 'সময়' অ্যাক্সেস করেন তখন আলাদা মান ফিরে আসে।


JSON ব্রাউজার দ্বারা সফলভাবে পার্স করেছিল? যদি তা হয় তবে হ্যাঁ এটি বৈধ (সে ক্ষেত্রে)।
হার্শওয়ার

7
@ হার্সওয়ারওয়্যার - এটি ঠিক যেমনটি জেএসএন জাভাস্ক্রিপ্টের সাথে সম্পর্কিত true ভাষা হিসাবে স্বাধীন ডেটা সিরিয়ালাইজেশন ফর্ম্যাট এটি মিথ্যা এবং নীচে যেতে সমস্যাযুক্ত রাস্তা।
jsoverson

@ জসোভারসন - আমি সম্মত আমার উত্তর নীচে দেখুন।
হার্শওয়ার

4
খোলা ওয়েবে কিট পরিদর্শক এবং চালানোর: সহজ এই প্রশ্নের নিজেকে উত্তর দিতে: JSON.parse('{now:function(){return(new Date).getTime()}')। পরিদর্শক বলেছেন: জেএসওএন স্পিকেUncaught SyntaxError: Unexpected token n তাত্ক্ষণিকভাবে দেখার বিষয়টি এটির সত্যতা নিশ্চিত করে। 'মান' বিভাগে ফোকাস করুন।
মার্ক ই। হাজেস

উত্তর:


103

না

জেএসএন নিখুঁতভাবে ডেটা বর্ণনার ভাষা হতে বোঝায়। Http://www.json.org এ উল্লিখিত হিসাবে এটি একটি "লাইটওয়েট ডেটা-ইন্টারচেঞ্জ ফর্ম্যাট"। - প্রোগ্রামিংয়ের ভাষা নয়।

প্রতি http://en.wikipedia.org/wiki/JSON , "প্রাথমিক ধরনের" সমর্থিত আছেন:

  • সংখ্যা (পূর্ণসংখ্যা, বাস্তব বা ভাসমান পয়েন্ট)
  • স্ট্রিং (ব্যাকস্ল্যাশ পলায়নের সাথে ডাবল-কোটেড ইউনিকোড)
  • বুলিয়ান (সত্য এবং মিথ্যা)
  • অ্যারে (মানগুলির একটি ক্রমবর্ধমান ক্রম, কমা দ্বারা পৃথক এবং বর্গাকার বন্ধনীগুলিতে আবদ্ধ)
  • অবজেক্ট (কী এর সংগ্রহ: মান জোড়া, কমা-বিচ্ছিন্ন এবং কোঁকড়া ধনুর্বন্ধনী বন্ধকযুক্ত)
  • null

4
@ডাঃ. জিম, না এবং জিনিসগুলির তুলনা করার জন্য আমি যা করি তা হ'ল এটি a==null?1:a.toString()==""কি এটি বলে যদি a = নাল থাকে তবে এটি 1 / সত্যটি ফেরত দেয়, যদি এটি "" অর্থ খালি স্ট্রিং হয় তবে আপনিও 1 / সত্য পাবেন যদি এটি হয় নাল বা "" না হলে এটি 0 / মিথ্যা ফিরে আসবে, আপনি [] এবং {} এর সাথে কাজ করার জন্য আরও এই প্রতিলিপি করতে পারেন কেবল ?1:a==[]?1:a.toString()=={}.toString();আমার পূর্ববর্তী স্নিপেটে যুক্ত করতে। সুতরাং সম্ভবত এই ফাংশন আপনাকে সাহায্য করবে। isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})আমি ব্যবহার করেন ?1:0পরিবর্তে ?true:falseকিন্তু (সত্য / মিথ্যা)
JamesM-SiteGen

11
একই সময়ে, ফাংশনগুলিও ডেটা।
অ্যারজিলে

4
জেএসএন ব্যবহার করে "আরও ডেটা" আনার উপায় খুঁজতে গিয়ে আমি এখানে পৌঁছেছি। কোন ক্লায়েন্টকে (সার্ভার থেকে) জানাতে ভাল লাগবে যে কীভাবে আরএসটি বা এপিআই পরবর্তী কল করা উচিত তা ভেবে চিন্তিত না করে কীভাবে আরও ডেটা পাবেন data
রবীন্দ্রনাথ আকিলা

4
@ রবীন্দ্রনাথআকিলা REST ইঙ্গিত দেয় যে সম্ভাব্য পরবর্তী এপিআই কলগুলি কলটিতে প্রকাশিত হবে। অন্য কথায়: আপনি যে রেস্ট্রিক অনুরোধটি করেছিলেন তা আপনাকে জানায় যে ভবিষ্যতের কোন অনুরোধগুলি আপনি করতে চাইতে পারেন (অ্যাপ্লিকেশন সিদ্ধান্তের যুক্তি এবং ডেটার ভিত্তিতে)। এর একটি নিখুঁত উদাহরণ গিথুব এপিআই, যেখানে ডেটা উপাদানগুলি ফেরত পাওয়া যায় - তবে তাদের মধ্যে কিছু অন্যান্য এপিআই অনুরোধ সংস্থানগুলিতে নিয়ে যায়।
জেনস এ। কোচ

4
@ জেনস-আন্দ্রেকোচ ধন্যবাদ! এটি পরীক্ষা করে
দেখবে

16

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

সুরক্ষা উদ্বেগের বরাত দিয়ে উইকিপিডিয়া জেএসএন এন্ট্রি জেএসএনে পদ্ধতিগুলি না অন্তর্ভুক্ত করার জন্য একটি ভাল কেস তৈরি করে:

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


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

আজ সত্য যে একমত। আমার কাছে উদ্ধৃত করার কোনও উত্স নেই, তবে আমি বিশ্বাস করি যে JSON একটি শব্দ ছিল যা জাভাস্ক্রিপ্ট গেমটিতে ইসএমএ আসার আগে তৈরি হয়েছিল, এবং জেএসওএন একটি স্ট্যান্ডার্ড ডেটা এক্সচেঞ্জ ফর্ম্যাট ছিল ... সুতরাং আমি 'বিবর্তিত' শব্দটি ব্যবহার করেছি
হার্শওয়ার

@ হার্সওয়ারওয়্যার আরএফসি 4627 অনুসারে, জেএসওএন ইসমা থেকে তৈরি হয়েছিল।
জেনা স্লোয়ান

9

আসুন অনুমানের একটিটির উদ্ধৃতি দেওয়া যাক - http://tools.ietf.org/html/rfc7159#section12

দ্য জাভাস্ক্রিপ্ট অবজেক্ট স্বরলিপি (তাদেরকে JSON) ডেটা ইন্টারচেঞ্জ ফরম্যাট স্পেসিফিকেশন পদ বলে:

জেএসএন জাভাস্ক্রিপ্টের একটি উপসেট তবে অ্যাসাইনমেন্ট এবং অনুরোধ বাদ দেয় exc

যেহেতু জেএসএনের সিনট্যাক্সটি জাভাস্ক্রিপ্ট থেকে ধার করা হয়েছে, তাই ভাষাটির "ইভাল ()" ফাংশনটি জেএসওএন পাঠ্য পার্স করার জন্য ব্যবহার করা সম্ভব। এটি সাধারণত একটি অগ্রহণযোগ্য সুরক্ষা ঝুঁকি গঠন করে, কারণ পাঠ্যটিতে
ডেটা ঘোষণার পাশাপাশি এক্সিকিউটেবল কোড থাকতে পারে
। একই বিবেচনাটি eval () ব্যবহারের ক্ষেত্রে প্রযোজ্য - অন্য কোনও প্রোগ্রামিং ভাষার যে ফাংশনগুলিতে JSON পাঠাগুলি সেই
ভাষার বাক্য গঠনটিকে মেনে চলে ।

সুতরাং সমস্ত উত্তর কোন রাজ্যে, যে ফাংশনগুলি JSON মানের অংশ নয় সেগুলি সঠিক are

সরকারী উত্তরটি হল: না, জেএসএন ফলাফলগুলিতে কার্যকারিতা সংজ্ঞায়িত করা বৈধ নয়!


উত্তর হ্যাঁ হতে পারে, কারণ "কোড হ'ল ডেটা" এবং "ডেটা হ'ল কোড"। এমনকি জেএসওএন ভাষা স্বাধীন ডেটা সিরিয়ালাইজেশন ফর্ম্যাট হিসাবে ব্যবহৃত হলেও, অন্যান্য ধরণের মাধ্যমে "কোড" এর একটি সুড়ঙ্গ কাজ করবে।

কার্যকর করার জন্য ক্লায়েন্ট-সাইড ব্রাউজারে একটি জেএস ফাংশনটি পাস করার জন্য একটি জেএসএন স্ট্রিং ব্যবহার করা যেতে পারে।

[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]

এটি প্রশ্নের মতো বাড়ে: কীভাবে " স্ট্রিং হিসাবে সঞ্চিত জাভাস্ক্রিপ্ট কোড চালানো যায়" "।

প্রস্তুত থাকুন, আপনার "evভাল () অশুভ" পতাকাটি উত্থাপন করার জন্য এবং এটির পাশের "জেএসএন-এর মাধ্যমে সুরক্ষা ফাংশনগুলি টানবেন না" stick


7

আমি যতদূর জানি এটি স্ট্যান্ডার্ড নয়। Http://json.org/ এ একটি তাত্ক্ষণিক নজর এটি নিশ্চিত করে।


4

না, অবশ্যই না।

আপনি যদি কোনও শালীন JSON সিরিয়ালাইজার ব্যবহার করেন তবে এটি আপনাকে সেটির মতো কোনও ক্রিয়াকলাপটি সিরিয়ালাইজ করতে দেয় না। এটি একটি বৈধ ওবিজেইসিটি, তবে বৈধ জেএসএন নয়। যে ওয়েবসাইটের উদ্দেশ্য যাই হোক না কেন, এটি বৈধ JSON প্রেরণ করে না।


4
আমি JSON-Lib ব্যবহার করি এবং এটিকে দুর্দান্ত সিরিয়ালাইজার হিসাবে বিবেচনা করি। [ব্যবহার পৃষ্ঠা] থেকে (json-lib.sourceforge.net/usage.html) আপনি দেখতে পাচ্ছেন যে এটি
ঠিকঠাক

মজাদার ... আমি এর আগে কখনও দেখিনি। স্পষ্টভাবে এটি অনুমান করা উচিত নয় ( json.org স্পষ্টভাবে বলেছে যে JSON ভাষা স্বতন্ত্র, যা ফাংশন সংজ্ঞা নয়) তবে আকর্ষণীয়।
jvenema

এটি মজার বিষয় যে এটি ভাষা স্বাধীন বলে মনে করা হচ্ছে তবে জেএসওএন জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন হুম অদ্ভুত ..
ন্যাট-উইলকিনস

3

জেএসএন স্পষ্টভাবে ফাংশনগুলি বাদ দেয় কারণ এটি জাভাস্ক্রিপ্ট-কেবলমাত্র ডেটা কাঠামো নয় (নামের জেএস থাকা সত্ত্বেও) isn't


3

একটি সংক্ষিপ্ত উত্তর হ'ল না ...

জেএসএন হ'ল একটি পাঠ্য বিন্যাস যা সম্পূর্ণ ভাষা স্বতন্ত্র তবে কনভেনশনগুলি ব্যবহার করে যা ভাষার সি-পরিবারের প্রোগ্রামারদের সাথে পরিচিত, সি, সি ++, সি #, জাভা, জাভাস্ক্রিপ্ট, পার্ল, পাইথন এবং আরও অনেকগুলি সহ। এই বৈশিষ্ট্যগুলি JSON কে একটি আদর্শ ডেটা-ইন্টারচেঞ্জ ভাষা করে।

কারণ দেখুন:

ব্রাউজার এবং সার্ভারের মধ্যে ডেটা বিনিময় করার সময়, ডেটা কেবল পাঠ্য হতে পারে।

জেএসএন হ'ল পাঠ্য, এবং আমরা যে কোনও জাভাস্ক্রিপ্ট অবজেক্টকে জেএসএন-তে রূপান্তর করতে এবং সার্ভারে জেএসওএন প্রেরণ করতে পারি।

আমরা সার্ভার থেকে প্রাপ্ত যে কোনও JSON কে জাভাস্ক্রিপ্ট অবজেক্টে রূপান্তর করতে পারি।

কোনও জটিল পার্সিং এবং অনুবাদ ছাড়াই আমরা জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে ডেটা নিয়ে কাজ করতে পারি।

তবে অপেক্ষা করুন ...

আপনার ক্রিয়াকলাপটি সংরক্ষণের এখনও বিভিন্ন উপায় রয়েছে, এটির পক্ষে এটি ব্যাপকভাবে প্রস্তাবিত নয় , তবে এখনও সম্ভব:

আমরা বলেছিলাম, আপনি একটি সংরক্ষণ করতে পারেন string... আপনার ফাংশনটিকে তখন স্ট্রিংয়ে রূপান্তর করবেন কীভাবে?

const data = {func: '()=>"a FUNC"'};

তারপরে আপনি ডেটাটি স্ট্রিংফাই করে ব্যবহার করতে পারেন JSON.stringify(data)এবং তারপরে JSON.parseপার্স করে ব্যবহার করতে পারেন (যদি এই পদক্ষেপের প্রয়োজন হয়) ...

এবং স্ট্রিং ফাংশনটি কার্যকর করতে ইওল করুন (এটি করার আগে, আপনাকে কেবলমাত্র বিস্তৃত আকারে প্রস্তাবিত নয়) ব্যবহার করে জানাতে হবে:

eval(data.func)(); //return "a FUNC"

0

নোডজেএস (সাধারণ জেএস সিনট্যাক্স) ব্যবহার করে আমি এই ধরণের কার্যকারিতাটি কাজ করতে সক্ষম হয়েছি, প্রাথমিকভাবে কিছু বাহ্যিক জেএস ফাইলের ভিতরে আমার কেবল একটি জেএসএন কাঠামো ছিল, তবে আমি চেয়েছিলাম যে কাঠামোটি আরও একটি শ্রেণীর হতে পারে, পদ্ধতিগুলির সাথে সিদ্ধান্ত নেওয়া যেতে পারে with রান সময়

মাইজেএসনে 'এক্সিকিউটর' ঘোষণার প্রয়োজন নেই।

var myJSON = {
    "Hello": "World",
    "Executor": ""
}

module.exports = {
    init: () => { return { ...myJSON, "Executor": (first, last) => { return first + last } } }
}

-3

JSON এ ফাংশন এক্সপ্রেশনগুলি সম্পূর্ণভাবে সম্ভব, কেবল এটি ডাবল উদ্ধৃতিতে আবৃত করতে ভুলবেন না। এখানে নোএসকিউএল ডাটাবেস ডিজাইন থেকে নেওয়া একটি উদাহরণ রয়েছে:

{
  "_id": "_design/testdb",
  "views": {
    "byName": {
      "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
    }
  }
}


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

@ জজনিস যদিও এটি সম্ভব। আপনি যদি একটি স্বতঃপ্রণোদিত ক্রিয়া যুক্ত করেন। এখানকার লোকেরা আপাতদৃষ্টিতে উত্তরটি জানেন না।
রোজ

-4

যদিও eval প্রস্তাবিত নয়, এটি কাজ করে:

<!DOCTYPE html>
<html>
<body>

<h2>Convert a string written in JSON format, into a JavaScript function.</h2>

<p id="demo"></p>

<script>
    function test(val){return val + " it's OK;}
    var someVar = "yup";
    var myObj = { "func": "test(someVar);" };
    document.getElementById("demo").innerHTML = eval(myObj.func);
</script>

</body>
</html>

4
ভোট দিয়েছিলেন কারণ উদাহরণটিতে HTML ব্যবহারের জন্য এটি প্রয়োজনীয় নয়, এটি 5 বছরের পুরানো কোডিং শৈলী, একটি অনুপস্থিত উদ্ধৃতি রয়েছে, এবং, জেএসওএন ফাইলগুলিতে ক্রিয়াকলাপ থাকার কথা নয়, যদি সেগুলি সিরিয়াল করা যায় না, বা এতে সংরক্ষণ করা যায় না a no sql DB,
মার্টিজন শেফার

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