jQuery.parseJSON "অবৈধ JSON" ত্রুটিটি JSON এ একক উদ্ধৃতি থেকে রক্ষা পেয়েছে


202

আমি ব্যবহার করে আমার সার্ভারে অনুরোধ করছি jQuery.post()এবং আমার সার্ভারটি JSON অবজেক্টগুলি (যেমন { "var": "value", ... }) ফিরিয়ে দিচ্ছে । তবে মানগুলির মধ্যে যদি কোনও একক উদ্ধৃতি (সঠিকভাবে পালিয়ে যায় \') থাকে তবে jQuery অন্যথায় বৈধ JSON স্ট্রিংকে পার্স করতে ব্যর্থ। আমি কী বোঝাতে চাইছি তার একটি উদাহরণ এখানে রয়েছে ( ক্রোমের কনসোলে সম্পন্ন ):

data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }

$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }

এটা কি স্বাভাবিক? JSON এর মাধ্যমে একটি একক উক্তিটি সঠিকভাবে পাস করার কোনও উপায় নেই?

উত্তর:


325

জেএসএন ওয়েবসাইটে স্টেট মেশিন ডায়াগ্রাম অনুসারে , কেবলমাত্র পালিয়ে যাওয়া ডাবল-কোট অক্ষরের অনুমতি রয়েছে, একক-উদ্ধৃতি নয়। একক উদ্ধৃতি অক্ষরগুলি এড়িয়ে যাওয়ার দরকার নেই:

http://www.json.org/string.gif


আপডেট - যারা আগ্রহী তাদের আরও তথ্য:


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

জেএসএনের ডিজাইন লক্ষ্যগুলি ছিল ন্যূনতম, পোর্টেবল, পাঠ্য এবং জাভাস্ক্রিপ্টের একটি উপসেট। আন্তঃসংযোগ স্থাপনের জন্য আমাদের যত কম সম্মত হওয়া দরকার, আমরা তত সহজেই আন্তঃসংযোগ করতে পারি can

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


একটি সামান্য বিট গভীর খনন, Crockford এর org.json জাভা জন্য তাদেরকে JSON বাস্তবায়ন আরো অনুমোদনযোগ্য এবং না একক উদ্ধৃতি অক্ষর মঞ্জুরি দিন:

টসস্ট্রিং পদ্ধতি দ্বারা উত্পাদিত পাঠগুলি জেএসএন সিনট্যাক্স নিয়মের সাথে কঠোরভাবে মেনে চলে। নির্মাতারা যে গ্রন্থগুলিকে গ্রহণ করবেন তাতে তারা ক্ষমা করে দিচ্ছে:

...

  • স্ট্রিংগুলি '(একক উদ্ধৃতি) দিয়ে উদ্ধৃত করা যেতে পারে।

এই দ্বারা নিশ্চিত করা হয় JSONTokener সোর্স কোড। nextStringপদ্ধতি পলান একক উদ্ধৃতি অক্ষর এবং মাত্র ডাবল উদ্ধৃতি অক্ষর মত একইরূপে তাদের স্বীকার করে:

public String nextString(char quote) throws JSONException {
    char c;
    StringBuffer sb = new StringBuffer();
    for (;;) {
        c = next();
        switch (c) {

        ...

        case '\\':
            c = this.next();
            switch (c) {

            ...

            case '"':
            case '\'':
            case '\\':
            case '/':
                sb.append(c);
                break;
        ...

পদ্ধতির শীর্ষে একটি তথ্যমূলক মন্তব্য:

আনুষ্ঠানিক JSON ফর্ম্যাটটি একক উদ্ধৃতিতে স্ট্রিংগুলিকে মঞ্জুরি দেয় না, তবে একটি বাস্তবায়ন সেগুলিকে গ্রহণ করার অনুমতি দেয়।

সুতরাং কিছু বাস্তবায়ন একক উদ্ধৃতি গ্রহণ করবে - তবে আপনার উপর নির্ভর করা উচিত নয়। অনেক জনপ্রিয় বাস্তবায়ন এক্ষেত্রে বেশ সীমাবদ্ধ এবং জেএসওএনকে প্রত্যাখ্যান করবে যাতে একক উদ্ধৃত স্ট্রিং এবং / অথবা পালানো একক উদ্ধৃতি রয়েছে।


শেষ পর্যন্ত মূল প্রশ্নের সাথে এটি বেঁধে রাখতেjQuery.parseJSON প্রথমে ব্রাউজারের নেটিভ জেএসএন পার্সার বা jos2.js এর মতো লোড লাইব্রেরি যেখানে প্রযোজ্য তা ব্যবহার করার চেষ্টা করুন (যা সাইড নোটটিতে লাইব্রেরিতে jQuery যুক্তিটি JSONসংজ্ঞায়িত না হলে ভিত্তিক করা হয় ) । সুতরাং jQuery কেবল যে অন্তর্নিহিত বাস্তবায়ন হিসাবে অনুমতিযোগ্য হতে পারে:

parseJSON: function( data ) {
    ...

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    ...

    jQuery.error( "Invalid JSON: " + data );
},

যতদূর আমি জানি এই বাস্তবায়নগুলি কেবলমাত্র অফিসিয়াল জেএসএন স্পেসিফিকেশন মেনে চলে এবং একক উদ্ধৃতি গ্রহণ করে না, তাই jQueryও নয়।


4
আপডেট করুন :: জেএসএন পেস্ট করার সময় জ্যাকুয়ারি খুব সীমাবদ্ধ। আপনি যদি সতর্কতা চেষ্টা করেন (p। পার্সজেসন ("[\" সিওও \\ '\ "]"))); এটি জাস্টিনের রিপোর্টের কারণে কাজ করে না
ডায়াটাঙ্গি

2
" জাকার জন্য জকসন এর ক্রকফোর্ডের org.json বাস্তবায়ন আরও অনুমোদিত এবং একক উদ্ধৃতি অক্ষরকে অনুমতি দেয় " # এটি ঠিক ভাল অনুশীলন: দৃust়তার নীতি
ডানকান জোন্স

1
@ ডানকোনজোনস - এই নিবন্ধটি JSON সম্পর্কিত কোনও ব্রাউজার কেন সেই নীতি অনুসরণ করছে না সে সম্পর্কে অন্তর্দৃষ্টি প্রদান করতে পারে: joelonsoftware.com/items/2008/03/17.html
জাস্টিন

1
@JustinEthier হিসাবে এই উত্তর দ্বারা নির্দিষ্ট stackoverflow.com/a/25491642/759452 , তাদেরকে JSON বৈশিষ্ট tools.ietf.org/html/rfc7159 বলছেন Any character may be escaped, এই ব্যাখ্যা হতে পারে কেন কিছু বাস্তবায়ন একক উদ্ধৃতি পলান করা সম্ভব হবে।
এড্রিয়েন

1
@ অ্যাড্রিনবি - আকর্ষণীয় ... তবে তারা কি বোঝাতে চেয়েছিল যে কোনও চরিত্রটি যদি 4 টি হেক্স ডিজিট নিয়ে থাকে তবে সে পালাতে পারে? উপরের রাজ্য চিত্র এবং আরএফসির 7 নং ধারায় থাকা উভয় অনুসারে, লিখিতভাবে একক উদ্ধৃতি থেকে পলায়নের \'অনুমতি নেই। আরএফসি যদি এই বিষয়টিতে আরও স্পষ্ট হয় তবে এটি দুর্দান্ত হবে।
জাস্টিন এথিয়ার

15

যদি আপনার স্ট্রিংয়ের ভিতরে একটি একক উক্তি প্রয়োজন হয়, যেহেতু spec 'অনুমান দ্বারা সংজ্ঞায়িত করা হয়েছে, তবে তাদের সবার জন্য http://www.utf8-chartable.de/\u0027 দেখুন

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


29
না, এএ প্লেইন একক উদ্ধৃতি ব্যবহার করুন।
জেফ কাউফম্যান

কখনও কখনও, টন ব্যাক-টিকের চেয়ে ইউনিকোড ব্যবহার করা সহজ। বিশেষত যখন পিছনে টিক্সের বিকল্পের ভিতরে থাকে।
slp

3
আপনার ব্যাকটিকসের দরকার হবে কেন? যদি আপনার "foo 'বার'" এর মতো স্ট্রিং থাকে তবে আপনি কেবলমাত্র একক উদ্ধৃতিগুলি আনসকেপড ছাড়বেন।
জেফ কাউফম্যান

3
ঠিক আমি খুঁজছেন ছিল কি. আমি একটি পৃষ্ঠায় একটি জেএসন স্ট্রিংটি একটি জেএস স্ট্রিং ভেরি হিসাবে লিখতে চেষ্টা করেছি এবং এটি একক উদ্ধৃতিতে আবদ্ধ করেছি এবং যখনই কোনও সম্পত্তির মানটিতে এটির একক উদ্ধৃতি থাকে তখন তা তাড়াতাড়ি বন্ধ হয়ে যায়। এখন আমি পৃষ্ঠায় লেখার আগে পিছনে কোডে কেবল একটি জসন করব ep প্রতিস্থাপন ("'", "\ u0027")।
জ্যাক

@ জ্যাক আপনার উদ্ধৃতি সহ জেএসওএন সংযুক্ত করা উচিত নয়। আপনার যদি বিদ্যমান জেএসএন স্ট্রিংয়ের বাইরে স্ট্রিং দরকার হয় তবে কেবল আবার স্ট্রিংফাই করুন। পিএইচপি, যে হবে var jsonEncodedAsString = <?= json_encode(myEncodedJson) ?>যেখানে myEncodedJsonএকটি পূর্ববর্তী ফল json_encode, যে আপনার একক উদ্ধৃতি পলায়নের যত্ন নিতে হবে আসলে, এটা ঠিক আউটপুট কিছু বড় স্ট্রিং উদ্ধৃতি চিহ্ন আবৃত, তাই একক উদ্ধৃতি পলান না করা হবে, কিন্তু উদ্ধৃতি চিহ্ন হবে ইচ্ছাশক্তি.
জুয়ান মেন্ডেস

5

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

আমি JSON স্ট্রিংকে বিশ্লেষণ করতে jquery` jQuery.parseJSON ফাংশনটি ব্যবহার করছি তবে json_encode দিয়ে প্রস্তুত করা তথ্যে যদি একটি একক উদ্ধৃতি পাওয়া যায় তখনও পার্স ত্রুটি পাওয়া যায়।

এটি আমার বাস্তবায়নে ভুল হতে পারে যা দেখতে (পিএইচপি - সার্ভার সাইড) দেখায়:

$data = array();

$elem = array();
$elem['name'] = 'Erik';
$elem['position'] = 'PHP Programmer';
$data[] = json_encode($elem);

$elem = array();
$elem['name'] = 'Carl';
$elem['position'] = 'C Programmer';
$data[] = json_encode($elem);

$jsonString = "[" . implode(", ", $data) . "]";

চূড়ান্ত পদক্ষেপটি আমি জেএসএন এনকোডেড স্ট্রিংটিকে একটি জেএস ভেরিয়েবলে সঞ্চয় করি:

<script type="text/javascript">
employees = jQuery.parseJSON('<?=$marker; ?>');
</script>

যদি আমি '' এর পরিবর্তে "" ব্যবহার করি তবে এটি ত্রুটি ছুঁড়ে ফেলে।

সমাধান:

আমার পক্ষে একমাত্র যে জিনিসটি কাজ করেছিল তা হ'ল বিটমাস্ক JSON_HEX_APOS এর মতো একক উদ্ধৃতিগুলিকে রূপান্তর করতে:

json_encode($tmp, JSON_HEX_APOS);

এই সমস্যাটি মোকাবেলার আর কি উপায় আছে? আমার কোডটি ভুল বা খারাপভাবে লেখা আছে?

ধন্যবাদ


'<= $ মার্কার; ?> 'এটি বৈধ জসন নয়। আশেপাশের উদ্ধৃতিগুলি জাভাস্ক্রিপ্ট ইন্টারপ্রেটার দ্বারা "খাওয়া" হয়ে গেছে এবং << দিয়ে শুরু হওয়া একটি স্ট্রিং রেখে যা আপনি সত্যিই চেষ্টা করতে চেয়েছিলেন সেটি হ'ল: jQuery.parseJSON ('"<? = $ চিহ্নিতকারী;?>" '); jQuery.parseJSON ("\" <? = $ চিহ্নিতকারী;?> \ ""); অনুমান অনুসারে, জসন স্ট্রিংগুলিতে অবশ্যই ডাবল উক্তি ব্যবহার করা উচিত, তবে জাভাস্ক্রিপ্টের কোনও যত্ন নেই, সুতরাং আপনার কাছে একটি একক-উদ্ধৃতি জাভাস্ক্রিপ্ট স্ট্রিং বা একটি ডাবল উদ্ধৃতি রয়েছে, তবে আপনি যদি উত্তরটি ব্যবহার করেন তবে আপনাকে সেগুলি থেকে সমস্ত পালিয়ে যেতে হবে স্ট্রিংয়ের ভিতরে ডাবল কোটসের ব্যবহার।
ক্রিস কগডন

3

আপনি যখন কোনও প্রশ্নের একক উদ্ধৃতি প্রেরণ করছেন

empid = " T'via"
empid =escape(empid)

আপনি যখন একক উদ্ধৃতি সহ মান পাবেন

var xxx  = request.QueryString("empid")
xxx= unscape(xxx)

আপনি যদি মানটি সন্ধান করতে / সন্নিবেশ করতে চান যা একটি ক্যোয়ারীতে একটি একক উদ্ধৃতি অন্তর্ভুক্ত করে xxx=Replace(empid,"'","''")


1
তবে জেএসএন স্ট্রিংয়ের অংশ হিসাবে এটি পাস করার সময় কোনও একক উক্তি থেকে বাঁচার দরকার নেই ...
জাস্টিন এথিয়ার

2

পিএইচপি এর নেটিভ ব্যবহার করে একটি জাভাস্ক্রিপ্ট স্ক্রিপ্ট-ব্লক আউটপুট করতে কেকপিএইচপি ব্যবহার করে অনুরূপ ইস্যুতে আঘাত করা json_encode$contractorCompaniesএকক উদ্ধৃতি চিহ্ন রয়েছে এবং উপরে বর্ণিত হিসাবে প্রত্যাশাগুলি json_encode($contractorCompanies)এগুলি এড়ায় না কারণ এর বৈধ JSON রয়েছে values

<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".(json_encode($contractorCompanies)."' );"); ?>

জেএসএন এনকোড স্ট্রিংয়ের চারপাশে অ্যাড্ল্যাশস () যুক্ত করে আপনি তারপরে কেক / পিএইচপি ব্রাউজারে সঠিক জাভাস্ক্রিপ্ট প্রতিধ্বনিত করতে উদ্ধৃতি চিহ্নগুলি এড়ান। জেএস ত্রুটিগুলি অদৃশ্য হয়ে যায়।

<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".addslashes(json_encode($contractorCompanies))."' );"); ?>

1

আমি একটি এক্সএইচআর অনুরোধ থেকে এইচটিএমএল 5 ডেটা * বৈশিষ্ট্যে কোনও জেএসওএন অবজেক্টটি সংরক্ষণ করার চেষ্টা করছিলাম। আমি সফলতা ছাড়াই উপরের অনেকগুলি সমাধান চেষ্টা করেছিলাম।

আমি শেষ পর্যন্ত যা করছিলাম তা হ'ল স্ট্রিংফাই () পদ্ধতিটি নীচের উপায়ে কল করার পরে একটি রেজেেক্স ব্যবহার করে কোডটির 'সাথে একক উদ্ধৃতিটি প্রতিস্থাপন করা হয়েছিল &#39;:

var productToString = JSON.stringify(productObject);
var quoteReplaced = productToString.replace(/'/g, "&#39;");
var anchor = '<a data-product=\'' + quoteReplaced + '\' href=\'#\'>' + productObject.name + '</a>';
// Here you can use the "anchor" variable to update your DOM element.

0

মজাদার. আপনি কীভাবে সার্ভারের শেষে আপনার JSON তৈরি করছেন? আপনি কি লাইব্রেরির ফাংশন ব্যবহার করছেন (যেমন json_encodeপিএইচপি তে), বা আপনি হাতে JSON স্ট্রিং তৈরি করছেন?

আমার দৃষ্টি আকর্ষণ করার একমাত্র জিনিস হ'ল এস্কেপ অ্যাডোস্ট্রোফ ( \')। আপনি যেমন ডাবল উক্তি ব্যবহার করছেন তা দেখতে যেমন আপনার সত্যই হওয়া উচিত, একক উদ্ধৃতি থেকে বাঁচার দরকার নেই। আমি সত্যিই এটি আপনার jQuery ত্রুটির কারণ কিনা তা আমি চেক করতে পারি না, কারণ আমি নিজেই এখনও 1.4.1 সংস্করণে আপডেট হয়নি।


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