স্ট্রিংটি পিএইচপি-তে JSON আছে কিনা তা যাচাই করার দ্রুততম উপায়?


385

আমার একটি সত্যিকারের, সত্যিকারের দ্রুত পদ্ধতি দরকার যা স্ট্রিংটি JSON কিনা তা যাচাই করার জন্য। আমি মনে করি এটি সর্বোত্তম উপায় নয়:

function isJson($string) {
    return ((is_string($string) &&
            (is_object(json_decode($string)) ||
            is_array(json_decode($string))))) ? true : false;
}

কোনও পারফরম্যান্স উত্সাহী কি এই পদ্ধতিটি উন্নত করতে চান?


3
শুধুমাত্র json_decodeএকবার ব্যবহার করে বিবেচনা করুন ... এছাড়াও, এর ইনপুট এবং রিটার্ন মানগুলি পরীক্ষা করে দেখুন json_decode

5
তো, কোনটি উত্তর?
ফরিদ আরএন

8
এখানে টার্নারি স্যুইচ অপ্রয়োজনীয়। আপনার বিবৃতি ইতিমধ্যে একটি বুলিয়ান হিসাবে মূল্যায়ন করে।
আমি একবার ভাল্লুক কুস্তি করেছিলাম।


লুইস দোনভানের উত্তরটি গ্রহণ করুন ... এটি
ঠিকঠাক

উত্তর:


573
function isJson($string) {
 json_decode($string);
 return (json_last_error() == JSON_ERROR_NONE);
}

19
দেখে মনে হচ্ছে সবাই এই উত্তরটিকে ভালবাসছে। কোন ব্যাখ্যা কেন?
কर्क ওউইমেট

8
আমি বিশ্বাস করি যে পিএসপি 5.3> json_last_error ফাংশনটি ব্যবহার করা দরকার
ক্রিস হ্যারিসন

97
স্ট্রিংয়ের প্রথম চরিত্রের জন্য পরীক্ষা করা {, [বা অন্য কোনও আক্ষরিকের প্রথম প্রতীকটি সম্ভবত সম্ভাব্যতাকে এই গতি বাড়িয়ে তুলতে পারে যখন আগত অনেকগুলি স্ট্রিং নন-জেএসওএন হওয়ার আশা করা হয়।
ওলেগ ভি। ভোলকভ

20
$ ফোন = '021234567'; , var_dump (isJson ($ ফোন)); সত্য ফিরে না! এটা মিথ্যা ফিরে উচিত।
Vee

23
সাবধান, এই ফাংশনটি যে কোনও সংখ্যার ক্ষেত্রেও সত্য ফিরে আসবে, আপনি এটি স্ট্রিং বা সত্য সংখ্যা হিসাবে নির্দিষ্ট করেছেন কিনা। 6.5 = true, '300' = true, 9 = trueইত্যাদি সুতরাং এই একটি বৈধ JSON মান হতে পারে কিন্তু আপনি শুধুমাত্র সঙ্গে বৈধ JSON স্ট্রিং জন্য চেক করতে চান তাহলে ফাংশন আচরণ নাও হতে পারে হিসাবে আপনি আশা, {}বা [];
BadHorsie

156

প্রশ্নের উত্তর দাও

ফাংশনটি json_last_errorজাসন এনকোডিং এবং ডিকোডিংয়ের সময় ঘটে যাওয়া শেষ ত্রুটিটি প্রদান করে। তাই কার্যকর জেএসএন চেক করার দ্রুততম উপায় হ'ল

// decode the JSON data
// set second parameter boolean TRUE for associative array output.
$result = json_decode($json);

if (json_last_error() === JSON_ERROR_NONE) {
    // JSON is valid
}

// OR this is equivalent

if (json_last_error() === 0) {
    // JSON is valid
}

মনে রাখবেন যে json_last_error কেবলমাত্র পিএইচপি> = 5.3.0 এ সমর্থিত।

সঠিক ERROR পরীক্ষা করার জন্য সম্পূর্ণ প্রোগ্রাম

বিকাশের সময় সঠিক ত্রুটিটি জানা সর্বদা ভাল। পিএইচপি ডক্সের উপর ভিত্তি করে সঠিক ত্রুটিটি পরীক্ষা করার জন্য এখানে সম্পূর্ণ প্রোগ্রাম রয়েছে।

function json_validate($string)
{
    // decode the JSON data
    $result = json_decode($string);

    // switch and check possible JSON errors
    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            $error = ''; // JSON is valid // No error has occurred
            break;
        case JSON_ERROR_DEPTH:
            $error = 'The maximum stack depth has been exceeded.';
            break;
        case JSON_ERROR_STATE_MISMATCH:
            $error = 'Invalid or malformed JSON.';
            break;
        case JSON_ERROR_CTRL_CHAR:
            $error = 'Control character error, possibly incorrectly encoded.';
            break;
        case JSON_ERROR_SYNTAX:
            $error = 'Syntax error, malformed JSON.';
            break;
        // PHP >= 5.3.3
        case JSON_ERROR_UTF8:
            $error = 'Malformed UTF-8 characters, possibly incorrectly encoded.';
            break;
        // PHP >= 5.5.0
        case JSON_ERROR_RECURSION:
            $error = 'One or more recursive references in the value to be encoded.';
            break;
        // PHP >= 5.5.0
        case JSON_ERROR_INF_OR_NAN:
            $error = 'One or more NAN or INF values in the value to be encoded.';
            break;
        case JSON_ERROR_UNSUPPORTED_TYPE:
            $error = 'A value of a type that cannot be encoded was given.';
            break;
        default:
            $error = 'Unknown JSON error occured.';
            break;
    }

    if ($error !== '') {
        // throw the Exception or exit // or whatever :)
        exit($error);
    }

    // everything is OK
    return $result;
}

বৈধ JSON ইনপুট দিয়ে পরীক্ষা করা হচ্ছে

$json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]';
$output = json_validate($json);
print_r($output);

বৈধ OUTPUT

Array
(
    [0] => stdClass Object
        (
            [user_id] => 13
            [username] => stack
        )

    [1] => stdClass Object
        (
            [user_id] => 14
            [username] => over
        )
)

অবৈধ জেএসএন দিয়ে পরীক্ষা করা হচ্ছে

$json = '{background-color:yellow;color:#000;padding:10px;width:650px;}';
$output = json_validate($json);
print_r($output);

অবৈধ OUTPUT

Syntax error, malformed JSON.

(পিএইচপি> = 5.2 এবং & পিএইচপি <5.3.0) এর জন্য অতিরিক্ত নোট

যেহেতু json_last_errorপিএইচপি 5.2 তে সমর্থিত নয়, আপনি এনকোডিং বা ডিকোডিং বুলিয়ান রিটার্ন কিনা তা পরীক্ষা করে দেখতে পারেন FALSE। এখানে একটি উদাহরণ

// decode the JSON data
$result = json_decode($json);
if ($result === FALSE) {
    // JSON is invalid
}

আশা করি এটি সহায়ক। শুভ কোডিং!


সামান্য নির্ভুলতা: যদি এই জসনটি বৈধ তবে পূর্বের ডিকোডডটি একটি অবৈধ, আপনার কোডটি সঠিকভাবে কাজ করবে, কারণ: " শেষ জেএসএন এনকোডিং / ডিকোডিংয়ের সময় ঘটে যাওয়া সর্বশেষ ত্রুটি (যদি থাকে) ফেরত দেয় । "
ব্রুনো

ধন্যবাদ @ মদন, "json_decode" যাচাইকরণ আমার কাছে সমাধান হয়েছে যে আমি পিএইচপি 7.0 চালাচ্ছি।
ফ্রান্সিস রডরিগস

অবশ্যই json_decode কেবল আক্ষরিক মিথ্যাটির জন্য মিথ্যা ফিরিয়ে দিতে পারে, সুতরাং ((strlen($json) === 5) && ($json !== 'false'))সেই প্রান্তটি এড়াতে চেকও করা উচিত?
মিঃমিজিজ

@ ব্রুনো যদি শেষ ডিকোডিংটি ত্রুটি ছাড়াই কাজ করে তবে json_last_errorফিরে আসে JSON_ERROR_NONE
Andrea

81

আপনার যা করতে হবে তা হ'ল ...

if (is_object(json_decode($MyJSONArray))) 
{ 
    ... do something ...
}

এই অনুরোধটির এমনকি পৃথক ফাংশন প্রয়োজন হয় না। শুধু jS__Decode এর চারপাশে is_object মোড়ানো এবং এগিয়ে যান। মনে হচ্ছে এই সমাধানটিতে লোকেরা এতে খুব বেশি চিন্তাভাবনা করে।


@ রোমানএম.কোস স্পষ্ট করে বলার জন্য, অ্যারেটি যদি একটি সাধারণ অ্যারে হয় তবে আপনাকে এটির is_arrayপাশাপাশি ব্যবহার is_objectকরতে is_objectহবে অন্যথায় জেএসওএন হিসাবে এনকোড করা সহজ অ্যারেগুলির জন্য মিথ্যা ফিরিয়ে দেওয়া হবে। সুতরাং @ggutenberg ঠিক এই ক্ষেত্রে। সত্য যুক্তিটি পাস করে json_decodeকোনও বস্তুকে অ্যারে হিসাবে ফিরিয়ে দিতে বাধ্য করে। আপনি তত্ত্বগতভাবে সবসময় ডিকোডকে একটি অ্যারেতে বাধ্য করতে পারেন এবং কেবল যাচাই করতে পারেন is_array, এটি কাজ করা উচিত।
userabuser

@ ইউজারবাউজার যদি আমি json_encode($array)সাধারণ পিএইচপি অ্যারের জন্য, এবং তারপরে json_decode($str)আমি বস্তুটি পাই , তবে অ্যারে পাব না। json_decode($str, true)অ্যারে রূপান্তর করতে বাধ্য। আপনার কোডটিতে জটিল স্ট্রিংগুলি কেন? is_array(json_decode($str, true))আপনি যখন এটি পড়বেন তখন কিছুক্ষণ পরীক্ষা করুন এবং আপনি বুঝতে পারবেন ডিকোড হওয়া অবশ্যই একটি অ্যারে হতে হবে be অনুমান করা খুব কঠিন is_object(json_decode($MyJSONArray))"ওহ, আমি এখানে ডিকোডডের জন্য যাচাই করছি একটি অ্যারে আছে কি না?"
রোমান এম কোস

@ রোমানএম.কোস নো, এটি সঠিক নয়, কোডপ্যাড.ভিপার- .com / / ফৌটারস্ক - যেমনটি আমি বলেছি, আপনি সর্বদা json_decodeঅবজেক্ট এবং অ্যারে পরীক্ষা করে সংরক্ষণ করার জন্য একটি অ্যারের ফিরিয়ে দিতে বাধ্য করতে পারেন, তবে যদি আপনি না করেন এবং আপনি json_decodeকী করেন না শুরু করার জন্য একটি সহজ অ্যারে ছিল, আপনি ডিকোডের বিনিময়ে একটি অ্যারে পাবেন, কোনও বস্তু নয়। আপনি JSON_FORCE_OBJECTযদি সর্বদা এনকোডে কোনও বস্তুকে জোর করতে চান তবে একটি সাধারণ অ্যারে পাস করাতে হবে অবশ্যই must
userabuser

11
বলার অপেক্ষা রাখে না Downvote: This request does not require a separate function even। কঠোরভাবে বলতে গেলে, কোনও সমাধানের জন্য পৃথক ফাংশন প্রয়োজন হয় না। একটি ফাংশন এর বিন্দু না কোডের এক লাইন মত কোড বর্ণন একাধিক লাইনের করা। ফাংশনটির বিষয়টি হ'ল আপনার আবেদনের যেকোন জায়গায় জেএসএন-চেকিং প্রক্রিয়াটিকে স্ট্যান্ডার্ড করে তোলা, যাতে বিভিন্ন প্রোগ্রামার (বা সময়ের সাথে একই প্রোগ্রামার) প্রোগ্রামের প্রবাহে বিভিন্ন পর্যায়ে বিভিন্ন চেকিং পদ্ধতি ব্যবহার না করে।
কার্টবফরহর্স

71

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

ব্যবহার করতে তাই এটি দ্রুত হতে পারে preg_matchএবং RFC4627 Regex করার সময় বৈধতা নিশ্চিত :

  // in JS:
  var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
         text.replace(/"(\\.|[^"\\])*"/g, '')));

পিএইচপি তে একই:

  return !preg_match('/[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]/',
       preg_replace('/"(\\.|[^"\\\\])*"/', '', $json_string));

এখানে বেনমার্কগুলি নিয়ে বিরক্ত করার মতো পারফরম্যান্স উত্সাহী যথেষ্ট নয়।


11
সম্পূর্ণ রিকার্সিভ Regex তাদেরকে JSON এখানে যাচাই করার জন্য: stackoverflow.com/questions/2583472/regex-to-validate-json/... - কিন্তু এটা PHPs সক্রিয় আউট json_decodeসবসময় দ্রুততর একটি PCRE Regex চেয়ে। (যদিও এটি খুব অনুকূলিত নয়, কোনও সিন্থেটিক পরীক্ষা পাওয়া যায় নি, এবং পার্লে এটি অন্যরকম আচরণ করতে পারে ..)
মারিও

3
@ হ্যাঁ, নোটের জন্য ধন্যবাদ তবে আসুন এটি এখানে [ভুলভাবে] রাখা উচিত, তাই বাস্তবে কেউই এটির উত্পাদন করতে ব্যবহার করে না।
মারিও

1
পছন্দ করুন আমি পিএইচপিএসের জন্য ডাবল উদ্ধৃত স্ট্রিং প্রসঙ্গে তখন বেঁচে থাকা সুস্থকে স্থির করেছি।
মারিও

1
পছন্দ করুন বেশিরভাগ সজ্জা। এটি কেবল আক্ষরিক ব্যাকস্ল্যাশ যা সত্যই দ্বিগুণভাবে পালানোর প্রয়োজন নেই। কারণ \r \n \tএটি কেবল অর্থবোধ করে যাতে পিএইচপি তাদের বিভক্ত করে না, তবে পিসিআরই তাদের ব্যাখ্যা করুন (কেবল /xমোডের জন্য প্রয়োজনীয় ছিল )। অন্যান্য ঘটনাগুলি এর কঠোরভাবে প্রয়োজন হয় না; তবুও সমস্ত স্ট্রিং পিএইচপি প্রসঙ্গে "ব্যাকস্ল্যাশ নিজেই পালিয়ে যায়"। সুতরাং এক এটি আরও সঠিক বিবেচনা করতে পারে।
মারিও

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

39

আপনার স্ট্রিংটি কোনও জসন অ্যারে বা বস্তুর প্রতিনিধিত্ব করলে এটি সত্য হবে :

function isJson($str) {
    $json = json_decode($str);
    return $json && $str != $json;
}

এটি জসন স্ট্রিংগুলিকে প্রত্যাখ্যান করে যাতে কেবল একটি সংখ্যা, স্ট্রিং বা বুলিয়ান থাকে যদিও এই স্ট্রিংগুলি প্রযুক্তিগতভাবে বৈধ জাসন।

var_dump(isJson('{"a":5}')); // bool(true)
var_dump(isJson('[1,2,3]')); // bool(true)
var_dump(isJson('1')); // bool(false)
var_dump(isJson('1.5')); // bool(false)
var_dump(isJson('true')); // bool(false)
var_dump(isJson('false')); // bool(false)
var_dump(isJson('null')); // bool(false)
var_dump(isJson('hello')); // bool(false)
var_dump(isJson('')); // bool(false)

এটি আমি সবচেয়ে সংক্ষিপ্ততম উপায়ে আসতে পারি।


Var_dump এর পরিবর্তে, আপনি এটি পিএইচপিউইনিট পরীক্ষা-মামলায় রাখতে পারেন। অন্যথায় আমি সত্যই জানতে পেরে অবাক এবং খুশি।
মিঃমিসিজ

3
যখন দুর্দান্ত কাজ করে তখন প্রত্যেকেরই কেন এত দীর্ঘ বায়ুর উত্তর থাকে? ধন্যবাদ।
টুডমো

1
সহজ, সুন্দর! "দ্রুততম উপায়" বা পারফরম্যান্স অনুসারে পরীক্ষা করে দেখেনি তবে এটি নিশ্চিত যে আমি সবসময় যাচাই করেছিলাম covers এটি কুখ্যাত প্রবাদের "একটি বাদাম ফাটানোর জন্য স্লেজহ্যামার ব্যবহার করবেন না" এর একটি সর্বোত্তম উদাহরণ । প্রোগ্রামার দৃষ্টিকোণ থেকে কোডটি সহজ, সংক্ষিপ্ত এবং সহজেই বোঝা সহজ, কর্মক্ষমতা বনাম সরলতা এই থ্রেডের সুযোগের বাইরে অন্য বিতর্ক scope
ফ্র0zenFyr

এটি একটি ঝরঝরে যুক্তিযুক্ত, তবে এটি নোট করুন যে এটি খালি অ্যারেগুলির জন্য মিথ্যা প্রত্যাবর্তন করে। উদাহরণস্বরূপ: var_dump(isJson('[]')); // bool(false)। বুলিয়ান সম্পর্কিত নথি অনুযায়ী, পিএইচপি মিথ্যা হিসাবে শূন্য উপাদানগুলির সাথে অ্যারেগুলি মূল্যায়ন করে। রিটার্নের স্টেটমেন্টটি সামঞ্জস্য করতে এখানে একটি ছোট্ট সংশোধনী দেওয়া হয়েছে; এটি return $json !== false && $str != $json;
ডিকোডড

@ j13k মূল তুলনা isJson('hello')সত্যের সাথে মূল্যায়ন করে, যা বৈধ json নয়। আলগা তুলনা এখানে উদ্দেশ্য চয়ন করা হয়। খালি অ্যারে / অবজেক্ট পরিস্থিতিটির জন্য আমার কাছে return $json == '[]' || ...
সিরিল

21

আমি যে সহজ ও দ্রুততম পদ্ধতিটি ব্যবহার করি তা অনুসরণ করা হচ্ছে;

$json_array = json_decode( $raw_json , true );

if( $json_array == NULL )   //check if it was invalid json string
    die ('Invalid');  // Invalid JSON error

 // you can execute some else condition over here in case of valid JSON

কারণ প্রবেশিত স্ট্রিংটি জসন বা অবৈধ জসন না হলে json_decode () NULL প্রদান করে।


JSON বৈধ করার জন্য সহজ ফাংশন

যদি আপনার একাধিক জায়গায় আপনার JSON বৈধ করতে হয়, আপনি সর্বদা নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন।

function is_valid_json( $raw_json ){
    return ( json_decode( $raw_json , true ) == NULL ) ? false : true ; // Yes! thats it.
}

উপরের ফাংশনে, আপনি যদি বৈধ JSON হন তবে আপনি তার বিনিময়ে সত্য পাবেন get


3
json_decode('null') == NULLএবং nullএটি একটি বৈধ JSON মান।
zzzzBov

Json.parser.online এ 'নাল' বৈধ জসন কিনা তা আমি পরীক্ষা করে দেখেছি তবে মনে হয় এটি বৈধ json নয়। এবং জসন_ডেকোড () হ'ল পিএসপি কোর ফাংশন যা জেসনকে বৈধতা দেওয়ার জন্য তাই আমি আমাদের আউটপুটটিতে কিছু ভুল ফলাফল পেতে সন্দেহ করি।
মোহাম্মদ মুরসালীন

কিছু যাচাই না করা ওয়েবসাইটে বিশ্বাস করার পরিবর্তে, সেই বিশদটির সাথে পরামর্শ করুন, যা একমত নয় (পৃষ্ঠা 2) । বিকল্পভাবে, JSON.parse('null')আপনার ডেভ কনসোল ব্যবহার করে দেখুন।
zzzzBov

19
function is_json($str){ 
    return json_decode($str) != null;
}

যখন অবৈধ এনকোডিং সনাক্ত হয়েছে তখন http://tr.php.net/manual/en/function.json-decode.php ফেরতের মান শূন্য হয়।


4
এটি "নাল" (যা জেএসএন বৈধ নয়, তবে জসন_ডেকোডে অন্যথায় পুরোপুরি "বৈধ" হতে পারে) এর জন্যও এটি ভুলভাবে বাতিল হবে। চিত্রে যান.

আমি মনে করি এটি সলড হওয়া: json_decode($str)!=null;বা অন্যথায় ফাংশনটি বলা উচিত is_not_json
যোশি

এই ফাংশনটির আরও ভাল নামকরণ করা হবে "JSON ব্যতীত অন্য কিছু"!
একাকী দিন

2
@ ব্যবহারকারী 166390, অনুমান json_decode('null')অনুসারে বৈধ JSON , এবং এর মানটি ফিরিয়ে দেওয়া উচিত null
zzzzBov

দয়া করে নোট করুন যে এই পদ্ধতির সাহায্যে is_json('false')এবং টাইপ হিসাবে পরীক্ষা না করে is_json('[]')ফিরে আসবে false। আমি মনে করি এই পদ্ধতিটি বরং ফিরে আসা উচিত $str === null || json_decode($str) !== null
এন্টোইন পিনসার্ড

11

আপনার পাসওয়ার্ডটি খালি নয় এবং প্রকৃতপক্ষে একটি স্ট্রিং রয়েছে তা নিশ্চিত করার জন্য আপনাকে অবশ্যই আপনার ইনপুটটি যাচাই করতে হবে। একটি খালি স্ট্রিং বৈধ JSON নয়।

function is_json($string) {
  return !empty($string) && is_string($string) && is_array(json_decode($string, true)) && json_last_error() == 0;
}

আমি মনে করি পিএইচপি-তে জেএসওন অবজেক্টে এমনকি ডেটা রয়েছে কিনা তা নির্ধারণ করা আরও গুরুত্বপূর্ণ , কারণ যে ডেটাটি আপনাকে কল করতে হবে তা ব্যবহার করতে json_encode()বা json_decode()। আমি খালি JSON অবজেক্টগুলি অস্বীকার করার পরামর্শ দিচ্ছি যাতে আপনি খালি ডেটাতে অকারণে এনকোড এবং ডিকোড চালাচ্ছেন না।

function has_json_data($string) {
  $array = json_decode($string, true);
  return !empty($string) && is_string($string) && is_array($array) && !empty($array) && json_last_error() == 0;
}

একটি বাস্তব-বিশ্বের প্রসঙ্গে সমস্যা সম্পর্কে আসলে চিন্তা করার জন্য +1।
কার্টবোরহোর্স

তবে '0'বৈধ জাসন নয় ... কেন আমি সতর্ক থাকব? @Kzqai
upful

11

এটি এটি করবে:

function isJson($string) {
    $decoded = json_decode($string); // decode our JSON string
    if ( !is_object($decoded) && !is_array($decoded) ) {
        /*
        If our string doesn't produce an object or array
        it's invalid, so we should return false
        */
        return false;
    }
    /*
    If the following line resolves to true, then there was
    no error and our JSON is valid, so we return true.
    Otherwise it isn't, so we return false.
    */
    return (json_last_error() == JSON_ERROR_NONE);
}

if ( isJson($someJsonString) ) {
    echo "valid JSON";
} else {
    echo "not valid JSON";
}

অন্যান্য json_last_error()উত্তরে যেমন দেখানো হয়েছে, আমাদের শেষ json_decode () থেকে যে কোনও ত্রুটি প্রদান করে। তবে কিছু প্রান্ত ব্যবহারের ক্ষেত্রে রয়েছে যেখানে একা এই ফাংশনটি যথেষ্ট পরিমাণে ব্যাপক নয়। উদাহরণস্বরূপ, আপনি যদি json_decode()একটি পূর্ণসংখ্যা (যেমন 123:), বা কোনও ফাঁকা স্থান বা অন্যান্য অক্ষর (যেমন "123":) সহ সংখ্যার একটি স্ট্রিং করেন তবে json_last_error()ফাংশনটি ত্রুটিটি ধরবে না।

এটিকে মোকাবেলায়, আমি একটি অতিরিক্ত পদক্ষেপ যুক্ত করেছি যা আমাদের ফলাফলটি json_decode()কোনও বস্তু বা অ্যারে হয় তা নিশ্চিত করে । যদি তা না হয় তবে আমরা ফিরে আসি false

এটি কার্যকরভাবে দেখতে, এই দুটি উদাহরণ পরীক্ষা করে দেখুন:


"hello"একটি বৈধ JSON, এবং এটি কোনও বস্তুও নয় বা json_last_error()
অ্যারেও

1
json_last_error()4আপনি json_decode()স্ট্রিং যখন ত্রুটি কোড প্রদান "hello"। এখানে উদাহরণস্বরূপ: 3v4l.org/lSsEo
লুইস

আপনার কোড ভুল, helloএকটি বৈধ JSON নয়, কিন্তু "hello"হয় 3v4l.org/OEJrQ
JoniJnm

9

সহজ পদ্ধতিটি হল জসন ফলাফলটি পরীক্ষা করা ..

$result = @json_decode($json,true);
    if (is_array($result)) {
        echo 'JSON is valid';
    }else{
        echo 'JSON is not valid';
    }

6

মধ্যে GuzzleHttp :

/**
 * Wrapper for json_decode that throws when an error occurs.
 *
 * @param string $json    JSON data to parse
 * @param bool $assoc     When true, returned objects will be converted
 *                        into associative arrays.
 * @param int    $depth   User specified recursion depth.
 * @param int    $options Bitmask of JSON decode options.
 *
 * @return mixed
 * @throws \InvalidArgumentException if the JSON cannot be decoded.
 * @link http://www.php.net/manual/en/function.json-decode.php
 */
function json_decode($json, $assoc = false, $depth = 512, $options = 0)
{
    $data = \json_decode($json, $assoc, $depth, $options);
    if (JSON_ERROR_NONE !== json_last_error()) {
        throw new \InvalidArgumentException(
            'json_decode error: ' . json_last_error_msg());
    }

    return $data;
}

/**
 * Wrapper for JSON encoding that throws when an error occurs.
 *
 * @param mixed $value   The value being encoded
 * @param int    $options JSON encode option bitmask
 * @param int    $depth   Set the maximum depth. Must be greater than zero.
 *
 * @return string
 * @throws \InvalidArgumentException if the JSON cannot be encoded.
 * @link http://www.php.net/manual/en/function.json-encode.php
 */
function json_encode($value, $options = 0, $depth = 512)
{
    $json = \json_encode($value, $options, $depth);
    if (JSON_ERROR_NONE !== json_last_error()) {
        throw new \InvalidArgumentException(
            'json_encode error: ' . json_last_error_msg());
    }

    return $json;
}

5

আগে আমি কেবল একটি নাল মান যাচাই করছিলাম যা আসলে ভুল ছিল।

    $data = "ahad";
    $r_data = json_decode($data);
    if($r_data){//json_decode will return null, which is the behavior we expect
        //success
    }

উপরের কোডটির টুকরোটি স্ট্রিংগুলির সাথে সূক্ষ্মভাবে কাজ করে। তবে আমি সংখ্যা সরবরাহ করার সাথে সাথে এটি ব্রেকআপ হয়ে যায় s উদাহরণস্বরূপ।

    $data = "1213145";
    $r_data = json_decode($data);

    if($r_data){//json_decode will return 1213145, which is the behavior we don't expect
        //success
    }

আমি যা করেছি তা ঠিক করার জন্য খুব সহজ ছিল।

    $data = "ahad";
    $r_data = json_decode($data);

    if(($r_data != $data) && $r_data)
        print "Json success";
    else
        print "Json error";

সুন্দর সমাধান। টাইপিংয়ের সমস্যাটি খুব ভালভাবে পরিচালনা করে!
চৌইক্স

5
//Tested thoroughly, Should do the job:
public static function is_json(string $json):bool
{
    json_decode($json);
    if (json_last_error() === JSON_ERROR_NONE) {
        return true;
    }
    return false;
}

4

আর একটি সহজ উপায়

function is_json($str)
{
    return is_array(json_decode($str,true));
}

1
এটি সঠিক নয়। যে কোনও পিএইচপি প্রকারের জেএসএনে এনকোড করা যেতে পারে যেমন অবজেক্টস, স্ট্রিং ইত্যাদি son এটি কেবল সত্য যদি আপনি সর্বদা অ্যারে ডিকোডিং করে থাকেন এবং অন্য কোনও ভেরিয়েবল প্রকার নেই।
চৌইক্স

@ ছাইওক্স ব্যবহার করে json_decode($str,true)এটি বস্তুগুলিকে অ্যারে রূপান্তর করে তোলে যাতে এটি_আররে চেকটি পাস করবে। আপনি স্ট্রিং, পূর্ণসংখ্যা ইত্যাদির বিষয়ে সংশোধন করেন যদিও।
পল ফিলিপস

আমি json_encode- র দ্বিতীয় প্যারামিটারটি সম্পর্কে কী বোঝাতে চাইছি তা আমি দেখতে পাচ্ছি। আমি এখনও মনে করি @ আহাদ আলীর সমাধানটি টাইপিংয়ের ক্ষেত্রে এবং আপনার অ্যালগরিদমে কেবল একবার json_decode করার চেয়ে আরও ভাল।
চৌইক্স

4

পাস করা স্ট্রিংগুলি সংখ্যাসূচক নয় কিনা তা আমাদের পরীক্ষা করা দরকার কারণ এই ক্ষেত্রে json_decode কোনও ত্রুটি উত্থাপন করে না।

function isJson($str) {
    $result = false;
    if (!preg_match("/^\d+$/", trim($str))) {
        json_decode($str);
        $result = (json_last_error() == JSON_ERROR_NONE);
    }

    return $result;
}

3

আমি সেগুলির কয়েকটি সমাধান চেষ্টা করেছি তবে কিছুই আমার পক্ষে কাজ করছে না। আমি এই সহজ জিনিস চেষ্টা:

$isJson = json_decode($myJSON);

if ($isJson instanceof \stdClass || is_array($isJson)) {
   echo("it's JSON confirmed");
} else {
   echo("nope");
}

দ্বিতীয় প্যারামিটার ছাড়াই জেএসএন ডিকোড করে কোনও জিনিস দেয় বলে আমি মনে করি এটি খুব সূক্ষ্ম সমাধান।

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


আপনার JSON সম্ভাব্য মাত্র একটি অ্যারে হতে পারে, সেক্ষেত্রে এটি স্টাডক্লাসের পরিবর্তে অ্যারে হবে be foo = "[1, 1, 2, 3]"; , var_dump (json_decode ($ foo বিন্যাস)); => অ্যারে (4) {[0] => ইনট (1) [1] => ইনট (1) [2] => ইনট (2) [3] =>
ইন্টি

3

নিম্নলিখিত শ্রেণীর সাথে পিএইচপিবিঞ্চ ব্যবহার করে, নীচের ফলাফলগুলি অর্জন করা হয়েছিল:

<?php

declare(strict_types=1);

/**
 * Benchmark doctrine persistent collection count method vs sizeof toArray
 * Revs is the number of times you want the benchmark to run
 * @Revs(1000)
 * @Iterations(100)
 */
class BenchmarkJson
{
    public function benchCatchValid(): bool
    {
        $validJson = '{"validJson":true}';
        try {
            json_decode($validJson, true, 512, JSON_THROW_ON_ERROR);
            return true;
        } catch(\JsonException $exception) {}
        return false;
    }

    public function benchCatchInvalid(): bool
    {
        $invalidJson = '{"invalidJson"';
        try {
            json_decode($invalidJson, true, 512, JSON_THROW_ON_ERROR);
            return true;
        } catch(\JsonException $exception) {}
        return false;
    }

    public function benchLastErrorValid(): bool
    {
        $validJson = '{"validJson":true}';
        json_decode($validJson, true);
        return (json_last_error() === JSON_ERROR_NONE);
    }

    public function benchLastErrorInvalid(): bool
    {
        $invalidJson = '{"invalidJson"';
        json_decode($invalidJson, true);
        return (json_last_error() === JSON_ERROR_NONE);
    }

    public function benchNullValid(): bool
    {
        $validJson = '{"validJson":true}';
        return (json_decode($validJson, true) !== null);
    }

    public function benchNullInvalid(): bool
    {
        $invalidJson = '{"invalidJson"';
        return (json_decode($invalidJson, true) !== null);
    }
}
6 subjects, 600 iterations, 6,000 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 0.714 [1.203 1.175] 1.073 s)
T: 721.504μs μSD/r 0.089μs μRSD/r: 7.270%
suite: 1343ab9a3590de6065bc0bc6eeb344c9f6eba642, date: 2020-01-21, stime: 12:50:14
+---------------+-----------------------+-----+------+-----+------------+---------+---------+---------+---------+---------+--------+-------+
| benchmark     | subject               | set | revs | its | mem_peak   | best    | mean    | mode    | worst   | stdev   | rstdev | diff  |
+---------------+-----------------------+-----+------+-----+------------+---------+---------+---------+---------+---------+--------+-------+
| BenchmarkJson | benchCatchValid       | 0   | 1000 | 100 | 2,980,168b | 0.954μs | 1.032μs | 1.016μs | 1.428μs | 0.062μs | 6.04%  | 1.33x |
| BenchmarkJson | benchCatchInvalid     | 0   | 1000 | 100 | 2,980,184b | 2.033μs | 2.228μs | 2.166μs | 3.001μs | 0.168μs | 7.55%  | 2.88x |
| BenchmarkJson | benchLastErrorValid   | 0   | 1000 | 100 | 2,980,184b | 1.076μs | 1.195μs | 1.169μs | 1.616μs | 0.083μs | 6.97%  | 1.54x |
| BenchmarkJson | benchLastErrorInvalid | 0   | 1000 | 100 | 2,980,184b | 0.785μs | 0.861μs | 0.863μs | 1.132μs | 0.056μs | 6.54%  | 1.11x |
| BenchmarkJson | benchNullValid        | 0   | 1000 | 100 | 2,980,168b | 0.985μs | 1.124μs | 1.077μs | 1.731μs | 0.114μs | 10.15% | 1.45x |
| BenchmarkJson | benchNullInvalid      | 0   | 1000 | 100 | 2,980,184b | 0.714μs | 0.775μs | 0.759μs | 1.073μs | 0.049μs | 6.36%  | 1.00x |
+---------------+-----------------------+-----+------+-----+------------+---------+---------+---------+---------+---------+--------+-------+

উপসংহার: যদি JSON বৈধ কিনা চেক করতে দ্রুততম উপায় আগমন হয় json_decode($json, true) !== null)


খুব সুন্দর :) আমি আপনাকে প্রশংসা করি
মাহদী

3

গতকাল, আমার কাজের অনুরূপ কিছু জুড়ে আসার পরে আমি এই প্রশ্নটি পেয়েছি। শেষ পর্যন্ত আমার সমাধানটি ছিল উপরের কয়েকটি পদ্ধতির সংকর:

function is_JSON($string) {

  $String_Is_JSON = (is_null(json_decode($string, TRUE))) ? FALSE : TRUE;

  return $String_Is_JSON;
}

2

আমি আমার সমাধানের পারফরম্যান্স বা কমনীয়তা সম্পর্কে জানি না, তবে আমি এটি ব্যবহার করছি:

if (preg_match('/^[\[\{]\"/', $string)) {
    $aJson = json_decode($string, true);
    if (!is_null($aJson)) {
       ... do stuff here ...
    }
}

যেহেতু আমার সমস্ত JSON এনকোডযুক্ত স্ট্রিংগুলি Reg "দিয়ে শুরু হয় এটি একটি রেজিএক্স দিয়ে পরীক্ষা করা যথেষ্ট suff আমি RegEx এর সাথে মোটেই সাবলীল নই, সুতরাং এটি করার আরও ভাল উপায় থাকতে পারে be এছাড়াও: স্ট্রপোসগুলি দ্রুত হতে পারে।

শুধু আমার tuppence মূল্য দিতে চেষ্টা।

জেএসএন /^[\[\{]\"/অ্যারের স্ট্রিংগুলি সন্ধান করতে পিএস সবেমাত্র রেজিএক্স স্ট্রিং আপডেট করেছে । সুতরাং এটি এখন স্ট্রিংয়ের শুরুতে ["বা {" এর জন্য অনুসন্ধান করে।


2

এর মতো কিছু হওয়া উচিত:

 function isJson($string)
 {
    // 1. Speed up the checking & prevent exception throw when non string is passed
    if (is_numeric($string) ||
        !is_string($string) ||
        !$string) {
        return false;
    }

    $cleaned_str = trim($string);
    if (!$cleaned_str || !in_array($cleaned_str[0], ['{', '['])) {
        return false;
    }

    // 2. Actual checking
    $str = json_decode($string);
    return (json_last_error() == JSON_ERROR_NONE) && $str && $str != $string;
}

ইউনিট পরীক্ষা

public function testIsJson()
{
    $non_json_values = [
        "12",
        0,
        1,
        12,
        -1,
        '',
        null,
        0.1,
        '.',
        "''",
        true,
        false,
        [],
        '""',
        '[]',
        '   {',
        '   [',
    ];

   $json_values = [
        '{}',
        '{"foo": "bar"}',
        '[{}]',
        '  {}',
        ' {}  '
    ];

   foreach ($non_json_values as $non_json_value) {
        $is_json = isJson($non_json_value);
        $this->assertFalse($is_json);
    }

    foreach ($json_values as $json_value) {
        $is_json = isJson($json_value);
        $this->assertTrue($is_json);
    }
}

আমি পছন্দ করি আপনি এটি স্ট্রিং কিনা তা পরীক্ষা করছেন। ErrorExceptionস্ট্রিং অ্যারে বা অবজেক্ট হলে এড়াতে প্রথম সমাধানের সাথে ভালভাবে যায় ।
সেকেজ

1

এই উত্তরটি প্রসারিত করে নিম্নলিখিতগুলি সম্পর্কে কীভাবে:

<?php

    $json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]';
    //$json = '12';

    function isJson($string) {
        json_decode($string);
        if(json_last_error() == JSON_ERROR_NONE) {
            if(substr($string,0,1) == '[' && substr($string,-1) == ']') { return TRUE; }
            else if(substr($string,0,1) == '{' && substr($string,-1) == '}') { return TRUE; }
            else { return FALSE; }
        }
    }

    echo isJson($json);
?>

1
যদি সেই পরীক্ষায় ত্রুটিটি পাওয়া যায় তবে সময় সাশ্রয়ের জন্য ডিকোড চালানোর আগে সাবস্ট্রিং চেক করা উচিত নয়? আমি কল্পনা করব যে 4 টি স্ট্রিং চেক একটি জসন_ডেকোডের চেয়ে দ্রুত হবে তবে যদি কেউ এই ধারণা নিয়ে আমাকে ব্যাক আপ করতে পারে তবে আমি এ সম্পর্কে কোনও ধারণার প্রশংসা করব।
চিহ্নিত করুন

এটি একটি ভাড়া যুক্তি। আমি প্রক্রিয়াকরণের সময় জড়িত জানি না, তবে এটি যদি দ্রুত হয় তবে হ্যাঁ।
সংঘর্ষগুলি 11

1

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

$input=trim($input);
if ((substr($input, 0, 1) == '{' && substr($input, -1) == '}') or (substr($input, 0, 1) == '[' && substr($input, -1) == ']')) {
    $output = json_decode($input, 1);
    if (in_array(gettype($output),['object','array'])) {
        #then it's definitely JSON
    }
}

এই প্রশ্নের 34 টি উত্তর পোস্ট করা হয়েছে, যার মধ্যে অনেকগুলি (ভুল) বিশ্বাসটিও সাবস্ক্রাইব করে যে জেএসওনকে একটি অ্যারে বা কোনও বস্তুর প্রতিনিধিত্ব করতে হবে। এই উত্তরটি কি অন্য 3 ডজন উত্তরের চেয়ে আলাদা কিছু করছে?
miken32

1

আমার কাছ থেকে আরেকটি পরামর্শ :)

function isJson(string $string) {
  return ($result = json_decode($string, true)) ? $result : $string;
}

0

কাস্টম ফাংশন

function custom_json_decode(&$contents=NULL, $normalize_contents=true, $force_array=true){

    //---------------decode contents---------------------

    $decoded_contents=NULL;

    if(is_string($contents)){

        $decoded_contents=json_decode($contents,$force_array);

    }

    //---------------normalize contents---------------------

    if($normalize_contents===true){

        if(is_string($decoded_contents)){

            if($decoded_contents==='NULL'||$decoded_contents==='null'){

                $contents=NULL;
            }
            elseif($decoded_contents==='FALSE'||$decoded_contents==='false'){

                $contents=false;
            }
        }
        elseif(!is_null($decoded_contents)){

            $contents=$decoded_contents;
        }
    }
    else{

        //---------------validation contents---------------------

        $contents=$decoded_contents;
    }

    return $contents;
}

মামলা

$none_json_str='hello';

//------------decoding a none json str---------------

$contents=custom_json_decode($none_json_str); // returns 'hello'

//------------checking a none json str---------------

custom_json_decode($none_json_str,false);

$valid_json=false;

if(!is_null($none_json_str)){

    $valid_json=true;

}

সম্পদ

https://gist.github.com/rafasashi/93d06bae83cc1a1f440b


0

সাফল্যের ডিকোডড ডেটা প্রয়োজন হলে পিএইচপি 5.2 সামঞ্জস্যের জন্য সদ্য তৈরি ফাংশন:

function try_json_decode( $json, & $success = null ){
  // non-strings may cause warnings
  if( !is_string( $json )){
    $success = false;
    return $json;
  }

  $data = json_decode( $json );

  // output arg
  $success =

    // non-null data: success!
    $data !==  null  ||

    // null data from 'null' json: success!
    $json === 'null' ||

    // null data from '  null  ' json padded with whitespaces: success!
    preg_match('/^\s*null\s*$/', $json );

  // return decoded or original data
  return $success ? $data : $json;
}

ব্যবহার:

$json_or_not = ...;

$data = try_json_decode( $json_or_not, $success );

if( $success )
     process_data( $data );
else what_the_hell_is_it( $data );

কিছু পরীক্ষা:

var_dump( try_json_decode( array(), $success ), $success );
// ret = array(0){}, $success == bool(false)

var_dump( try_json_decode( 123, $success ), $success );
// ret = int(123), $success == bool(false)

var_dump( try_json_decode('      ', $success ), $success );
// ret = string(6) "      ", $success == bool(false)

var_dump( try_json_decode( null, $success ), $success );
// ret = NULL, $success == bool(false)

var_dump( try_json_decode('null', $success ), $success );
// ret = NULL, $success == bool(true)

var_dump( try_json_decode('  null  ', $success ), $success );
// ret = NULL, $success == bool(true)

var_dump( try_json_decode('  true  ', $success ), $success );
// ret = bool(true), $success == bool(true)

var_dump( try_json_decode('  "hello"  ', $success ), $success );
// ret = string(5) "hello", $success == bool(true)

var_dump( try_json_decode('  {"a":123}  ', $success ), $success );
// ret = object(stdClass)#2 (1) { ["a"]=> int(123) }, $success == bool(true)

0
function is_json($input) {

    $input = trim($input);

    if (substr($input,0,1)!='{' OR substr($input,-1,1)!='}')
        return false;

    return is_array(@json_decode($input, true));
}

2
@ ডিবাগিংয়ের জন্য ব্যবহার করুন (একটি ত্রুটি লুকিয়ে
রাখছেন

0

সর্বাধিক প্রয়োজনীয় সম্ভাবনাগুলিকে স্পর্শ করতে হেনরিকের উত্তরের একটি সাধারণ পরিবর্তন।

("{} এবং []" সহ)

function isValidJson($string) {
    json_decode($string);
    if(json_last_error() == JSON_ERROR_NONE) {

        if( $string[0] == "{" || $string[0] == "[" ) { 
            $first = $string [0];

            if( substr($string, -1) == "}" || substr($string, -1) == "]" ) {
                $last = substr($string, -1);

                if($first == "{" && $last == "}"){
                    return true;
                }

                if($first == "[" && $last == "]"){
                    return true;
                }

                return false;

            }
            return false;
        }

        return false;
    }

    return false;

}

0

দ্রুততম উপায় হয়তো পিএইচপি বস্তুর / অ্যারেতে একটি সম্ভাব্য JSON সামগ্রী ডিকোড:

/**
 * If $value is a JSON encoded object or array it will be decoded 
 * and returned.
 * If $value is not JSON format, then it will be returned unmodified.
 */
function get_data( $value ) {
    if ( ! is_string( $value ) ) { return $value; }
    if ( strlen( $value ) < 2 ) { return $value; }
    if ( '{' != $value[0] && '[' != $value[0] ) { return $value; }

    $json_data = json_decode( $value );
    if ( ! $json_data ) { return $value; }
    return $json_data;
}

0

এখানে আমি তৈরি করেছি একটি পারফরম্যান্ট এবং সাধারণ ফাংশন (এটি json_decodeবৃহত্তর স্ট্রিংয়ের জন্য ব্যবহারের আগে মৌলিক স্ট্রিংয়ের বৈধতা ব্যবহার করে):

function isJson($string) {
    $response = false;

    if (
        is_string($string) &&
        ($string = trim($string)) &&
        ($stringLength = strlen($string)) &&
        (
            (
                stripos($string, '{') === 0 &&
                (stripos($string, '}', -1) + 1) === $stringLength
            ) ||
            (
                stripos($string, '[{') === 0 &&
                (stripos($string, '}]', -1) + 2) === $stringLength
            )
        ) &&
        ($decodedString = json_decode($string, true)) &&
        is_array($decodedString)
    ) {
        $response = true;
    }

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