পিএইচপি json_decode () বৈধ JSON দিয়ে NULL ফেরত?


104

আমার এই JSON অবজেক্টটি একটি সরল পাঠ্য ফাইলে সংরক্ষণ করা হয়েছে:

{
    "MySQL": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "DatabaseName": "(dbname)"
    },
    "Ftp": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "RootFolder": "(rf)"
    },
    "BasePath": "../../bin/",
    "NotesAppPath": "notas",
    "SearchAppPath": "buscar",
    "BaseUrl": "http:\/\/montemaiztusitio.com.ar",
    "InitialExtensions": [
        "nem.mysqlhandler",
        "nem.string",
        "nem.colour",
        "nem.filesystem",
        "nem.rss",
        "nem.date",
        "nem.template",
        "nem.media",
        "nem.measuring",
        "nem.weather",
        "nem.currency"
    ],
    "MediaPath": "media",
    "MediaGalleriesTable": "journal_media_galleries",
    "MediaTable": "journal_media",
    "Journal": {
        "AllowedAdFileFormats": [
            "flv:1",
            "jpg:2",
            "gif:3",
            "png:4",
            "swf:5"
        ],
        "AdColumnId": "3",
        "RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
        "FrontendLayout": "Flat",
        "AdPath": "ad",
        "SiteTitle": "Monte Maíz: Tu Sitio",
        "GlobalSiteDescription": "Periódico local de Monte Maíz.",
        "MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
        "TemplatePath": "templates",
        "WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
        "WeatherMeasureType": "1",
        "CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
        "TimesSingular": "vez",
        "TimesPlural": "veces"
    }
}

আমি যখন এটির সাথে ডিকোড করার চেষ্টা করি তখন json_decode()এটি NULL দেয়। কেন? ফাইলটি পঠনযোগ্য (আমি প্রতিধ্বনিত করার চেষ্টা করেছি file_get_contents()এবং এটি ঠিক আছে)।

আমি জেএসএনকে http://jsonlint.com/ এর বিপরীতে পরীক্ষা করেছি এবং এটি পুরোপুরি বৈধ।

এখানে কি সমস্যা?

সমাধান

গুগলে উত্তর খুঁজছেন, আমি আবার ফিরে এলাম: json_decode ওয়েবসার্ভিস কল পরে NULL ফেরত । আমার জেএসওএন ফাইলটিতে ইউটিএফ বিওএম সিকোয়েন্স ছিল (কিছু বাইনারি চর যা সেখানে হওয়া উচিত নয়), এইভাবে, জেএসএন কাঠামোটি ভেঙে। হেক্স সম্পাদক এ গিয়েছিলেন, বাইটগুলি মুছলেন। সবকিছু স্বাভাবিক অবস্থায় ফিরে এসেছে। কেন এমন হয়েছে? কারণ আমি মাইক্রোসফ্ট উইন্ডোজ নোটপ্যাড ব্যবহার করে ফাইলটি সম্পাদনা করেছি। ভয়াবহ ধারণা!


5
পিএইচপি 5.2.9 এর সাথে কাজ করা; সুতরাং, আমি ব্যবহার করতে পারি না json_last_error()
জোয়েল এ ভিলারিয়াল বার্টল্ডি

1
এছাড়াও নোট করুন ফাইলের মাঝখানে অন্য অবৈধ অক্ষরের সাথে এটি ঘটতে পারে। আমার সবেমাত্র json_decode () নাল ফিরেছে কারণ স্ট্রিংটিতে সেই বিশেষ এন-ড্যাশগুলির মধ্যে একটি রয়েছে, সম্ভবত এমএস ওয়ার্ড থেকে আটকানো হয়েছে এবং পরে ভুল-এনকোডেড থাকতে পারে। সম্ভাব্য সমস্যার অক্ষরগুলি সনাক্ত করতে, JSON ফাইলটি খুলুন (আমি নোটপ্যাড ++ এ ব্যবহার করেছি), এনকোডিং পরিবর্তন করুন (রূপান্তর না করে) এবং অনুলিপি হিসাবে সংরক্ষণ করুন। তারপরে দুটি ফাইলের মধ্যে পার্থক্য করুন (আমি উইনমার্গ ব্যবহার করেছি)।
লিনাসআর

(উইন্ডোজ নোটপ্যাড ইস্যু) দয়া করে, এটি পরামর্শ করুন, আমি সমস্যাটিও ভাগ করে নিলাম এবং এটি ঠিক করে দিয়েছে: stackoverflow.com/questions/10290849/…
ফেলিক্স আবাল্লি


আমার জন্য, এটি বিশেষ কিছু ছিল না, কোনও জিনিসের উপাদানটির শেষে কেবল একটি অতিরিক্ত কমা। দূরে সরিয়ে নিন: যে কোনও কিছু যা আপনার জেএসওএনকে বেমানান করে তোলে, ত্রুটি ফেলছে। বোনাস টিপ: jsonviewer.stack.hu বিশ্বাস করবেন না jsonlint এর মতো কিছু ব্যবহার করুন
আমান আলম

উত্তর:


68

এটি বিশেষ চরিত্রগুলির এনকোডিং হতে পারে। আপনি json_last_error () কে সুনির্দিষ্ট তথ্য জানতে চাইতে পারেন।

আপডেট: ইস্যুটি সমাধান হয়েছে, প্রশ্নের "সমাধান" অনুচ্ছেদ দেখুন।


আমি অ্যাপ্লিকেশন শুরু করার পর থেকে আমি বিশেষ চরিত্রগুলি ব্যবহার করছি এবং এর আগে কোনও সমস্যা ছিল না। স্থানীয়ভাবে, জেএসওন ডিকোডিং পুরোপুরি কাজ করে। আমার সার্ভারে, এটি হয় না। এবং আমি কল করতে পারি না json_last_error()কারণ এটি পিএইচপি 5.2.9। এই ফাংশনটি পিএইচপি 5.3.0 এ উপস্থিত হয়।
জোয়েল এ ভিলারিয়াল বার্টল্ডি

1
নাহ, এটি কাজ করা উচিত। আমি এখনই আরও পরীক্ষা করতে পারছি না, যদি পরে তা পাই তবে আমি এখানে পোস্ট করব। ব্যবহারকারীর অবদান নোটের কয়েকটি ইঙ্গিতও রয়েছে : de.php.net/json_decode হয়তো কিছু সাহায্য করে।
পেক্কা

1
আমার জন্য, পিএইচপি 5.3 এ, পাঠ্যটি ইউটিএফ -8 এ এনকোড করা থাকলে এটি ঠিকঠাক কাজ করে। তবে আমি যদি utf8_decode()প্রথমে পাঠ্যটি পাস করি তবে json_decode()চুপচাপ ব্যর্থ ails
ম্যাথু

1
Google এ উত্তরের জন্য @Pekka খুঁজছেন, আমি তাই ফিরে পেয়েছে: stackoverflow.com/questions/689185/json-decode-returns-null-php । আমার জেএসওএন ফাইলটিতে ইউটিএফ বিওএম সিকোয়েন্স ছিল (কিছু বাইনারি চর যা সেখানে হওয়া উচিত নয়), এইভাবে, জেএসএন কাঠামোটি ভেঙে। হেক্স সম্পাদক এ গিয়েছিলেন, বাইটগুলি মুছলেন। সবকিছু স্বাভাবিক অবস্থায় ফিরে এসেছে। কেন এমন হয়েছে? কারণ আমি মাইক্রো t অফ উইন্ডোজ 'নোটপ্যাড ব্যবহার করে ফাইলটি সম্পাদনা করেছি। ভয়াবহ ধারণা!
জোয়েল এ ভিলারিয়াল বার্টল্ডি

2
এটি পিএইচপি লোকদের একটি বাগ হিসাবে রিপোর্ট করা উচিত। যদি বিওএমটি বৈধ ইউটিএফ 8 হয়, তবে এটি চুপ করে চুপ করা উচিত নয়।
jmucchiello

86

এটি আমার পক্ষে কাজ করেছে

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true );

2
আমি এটি ব্যবহার করেছি এবং অ্যারে পেয়েছি তবে আমার ভাষার নির্দিষ্ট অক্ষর (ş, ç, ö, .. )ও মুছে ফেলা হয়েছে।
zkanoca

5
এটি যদি জাসন ডেটাটি ইউটিএফ -8 এনকোডযুক্ত হয় (বা কোনও ইউটিএফ এনকোডিং আমি অনুমান করি) তবে এটি সঠিক নয়। এটি বৈধ ইউটিএফ-8-এনকোডড ডেটা সরিয়ে ফেলবে। ফাইলটিতে কেবল ইংরাজী ভাষা থাকে ততক্ষণ এটি সম্ভবত কাজ করবে তবে এটি সর্বদা ঝুঁকিপূর্ণ অনুমান। আমি এটি ব্যবহার করব না।
দাদালুস

এটির সাহায্যে এটি কাজ করে তবে তা না করে, এমনকি দুটি স্ট্রিংও অভিন্ন, আমি কি কিছু মিস করছি?
রুডি ভিজার

এটা কাজ করে! কিন্তু কেন? আমি যে স্ট্রিংটি ডিকোড করার চেষ্টা করেছি তাতে কোনও বিশেষ অক্ষর ছিল না
টোবিয়াস গ্যাসম্যান

অসাধারণ. আমার জন্য কাজ করেছেন। :)
সোহিল

31

আপনি এটি দিয়ে চেষ্টা করতে পারেন।

json_decode(stripslashes($_POST['data']))

আমি দুর্ঘটনাক্রমে stripslashes()দু'বার কল করেছি, যা প্রয়োজনীয় স্ল্যাশগুলি সরিয়ে ফেলেছে এবং অকার্যকর JSON স্ট্রিংয়ের কারণ হয়েছে। এই উত্তরটি আমাকে ত্রুটিটি চিহ্নিত করতে সহায়তা করেছে
ফিলিপ

22

আপনি ক্রোমের অনুরোধটি পরীক্ষা করে দেখেন যে JSONটি পাঠ্য, তাই জেএসওএন-তে খালি কোড যুক্ত হয়েছে।

আপনি এটি ব্যবহার করে সাফ করতে পারেন

$k=preg_replace('/\s+/', '',$k);

তারপরে আপনি ব্যবহার করতে পারেন:

json_decode($k)

print_r তারপরে অ্যারে প্রদর্শন করবে।


এর জন্য ধন্যবাদ - আশা করি আপনি আপনার হারিয়ে যাওয়া ইংরেজি খুঁজে পেয়েছেন find
ডিন_উইলসন

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

এটা আমার জন্য !! আমি তৈরি একটি সহজ ঝাঁকুনি প্রতিস্থাপনে একটি স্থান যুক্ত করা হচ্ছে, এটি ব্যবহার করছি, এবং এটি আমার স্থানটিকেও প্রতিস্থাপন করবে বলে মনে হচ্ছে। এখন ঠিক কাজ করে। $k=preg_replace('/\s+/', ' ',$k);
কাশ

সমস্যাটি হচ্ছে, এটি প্রতিটি একক স্থান সরিয়ে দেয়, ইংরেজী পাঠ্যকে একসাথে আটকে রেখেছিল তাই না?
কোডগুরু

14

আমার একই সমস্যা ছিল এবং আমি ডিকোডের আগে উদ্ধৃতি চরিত্রটি প্রতিস্থাপন করে কেবল এটি সমাধান করেছি।

$json = str_replace('"', '"', $json);
$object = json_decode($json);

আমার JSON মান JSON.stringify ফাংশন দ্বারা উত্পন্ন হয়েছিল।


এই ক্ষেত্রে এইচটিএমএল স্পেশালচার্স ফাংশনটি সম্ভবত ব্যবহার করা হচ্ছে এবং জেএসএনকে আর পার্স করা যাবে না। এটির বিপরীতে ম্যানুয়ালি প্রতিস্থাপনের পরিবর্তে "এইচটিএমএল স্পেশালচার্স_ডেকোড" ফাংশন রয়েছে &
ডেভি

11

হতে পারে কিছু লুকানো অক্ষর আপনার জসনের সাথে গোলযোগ করছে, এটি চেষ্টা করুন:

$json = utf8_encode($yourString);
$data = json_decode($json);

উপরের সমস্ত সমাধান চেষ্টা করার পরে, এইটি আমার জন্য কাজ করেছে। অসংখ্য ধন্যবাদ!!
আনিস আর।

7
$k=preg_replace('/\s+/', '',$k); 

এটা আমার জন্য। এবং হ্যাঁ, Chrome এ পরীক্ষা করা হচ্ছে। থেক্স থেকে ইউজার 25254008


4

আমি ভেবেছিলাম যে আমি এটিকে যুক্ত করব, আজ আমি এই ইস্যুটিতে দৌড়ে যাচ্ছি। আপনার জেএসএন স্ট্রিংকে ঘিরে যদি কোনও স্ট্রিং প্যাডিং থাকে তবে json_decode NULL প্রত্যাবর্তন করবে।

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

$jsonData = trim($jsonData);

4

এটি আপনাকে ত্রুটির ধরণ কী তা বুঝতে সহায়তা করে

<?php
// A valid json string
$json[] = '{"Organization": "PHP Documentation Team"}';

// An invalid json string which will cause an syntax 
// error, in this case we used ' instead of " for quotation
$json[] = "{'Organization': 'PHP Documentation Team'}";


foreach ($json as $string) {
    echo 'Decoding: ' . $string;
    json_decode($string);

    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - No errors';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Syntax error, malformed JSON';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
        default:
            echo ' - Unknown error';
        break;
    }

    echo PHP_EOL;
}
?>

2

শুধু কিছু সময় সাশ্রয় করুন। আমি এটি কেবল এইচটিএমএল এনকোডিং সমস্যা ছিল তা জানতে 3 ঘন্টা ব্যয় করেছি। এটা চেষ্টা কর

if(get_magic_quotes_gpc()){
   $param = stripslashes($row['your column name']);
}else{
  $param = $row['your column name'];
}

$param = json_decode(html_entity_decode($param),true);
$json_errors = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
);
echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
print_r($param);

1

যেমন জর্জেন ম্যাথ দ্বারা ব্যবহারকারী2254008 তালিকাভুক্ত প্রাক পদ্ধতি ব্যবহার করে তা আমার জন্যও ঠিক করে দিয়েছে।

এটি ক্রোমের মধ্যে সীমাবদ্ধ নয়, এটি একটি চরিত্র সেট রূপান্তর সমস্যা হিসাবে উপস্থিত বলে মনে হচ্ছে (কমপক্ষে আমার ক্ষেত্রে, ইউনিকোড -> ইউটিএফ 8) এটি আমার যাবতীয় সমস্যাগুলির সমাধান করেছে।

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


1

আপনি যদি ডাটাবেস থেকে জসন পাচ্ছেন, রাখুন

mysqli_set_charset($con, "utf8");

সংযোগ লিঙ্ক ining কন সংজ্ঞা দেওয়ার পরে


আপনাকে ধন্যবাদ টোমমিহ এটি আমার মাইএসকিউএল-এর সাথে বিশেষ অক্ষর সমন্বিত সমস্ত সমস্যার সাথে খাপ খায় এবং যখন জসন_ডেকোড দ্বারা রূপান্তরিত হয়, তখন সেই নির্দিষ্ট ক্ষেত্রটি = নাল ....
কেএলএল


1

আমার ক্ষেত্রে, এটি JSON স্ট্রিংয়ের একক উদ্ধৃতির কারণে।

JSON ফর্ম্যাট কেবল কী এবং স্ট্রিংয়ের মানগুলির জন্য ডাবল-কোট গ্রহণ করে।

উদাহরণ:

$jsonString = '{\'hello\': \'PHP\'}'; // valid value should be '{"hello": "PHP"}'
$json = json_decode($jsonString);
print $json; // null

জাভাস্ক্রিপ্ট সিনট্যাক্সের কারণে আমি এটি বিভ্রান্ত হয়ে পড়েছি। জাভাস্ক্রিপ্টে অবশ্যই আমরা এটি করতে পারি:

let json = {
    hello: 'PHP' // no quote for key, single quote for string value
}

// OR:
json = {
    'hello': 'PHP' // single quote for key and value
}

তবে পরে যখন সেই জিনিসগুলিকে JSON স্ট্রিংয়ে রূপান্তর করুন:

JSON.stringify(json); // "{"hello":"PHP"}"

0

আমি JSON মুদ্রণ করে এবং পরে পৃষ্ঠার উত্স (সিটিআরএল / সিএমডি + ইউ) পরীক্ষা করে এই সমস্যাটি সমাধান করেছি:

print_r(file_get_contents($url));

দেখা গেল সেখানে একটি পিছনের <pre>ট্যাগ ছিল।


0

আপনার এই পয়েন্টগুলি নিশ্চিত করা উচিত

1. আপনার জসন স্ট্রিংয়ের কোনও অজানা অক্ষর নেই

2. JSON স্ট্রিংকে অনলাইন JSON দর্শক থেকে দেখতে পারেন (আপনি অনলাইনে ভিউয়ার বা JSON জন্য পার্সার যেমন Google এ অনুসন্ধান করতে পারেন) এটা কোনো ত্রুটি ছাড়া দেখা উচিত

৩. আপনার স্ট্রিংটিতে এইচটিএমএল সত্তা নেই এটি সরল পাঠ / স্ট্রিং হওয়া উচিত

3 পয়েন্ট ব্যাখ্যার জন্য

$html_product_sizes_json=htmlentities($html);
    $ProductSizesArr = json_decode($html_product_sizes_json,true);

থেকে (Remove htmlentities () ফাংশন)

$html_product_sizes_json=$html;
    $ProductSizesArr = json_decode($html_product_sizes_json,true);

0

আমার জন্য, জাসন_ডেকোড () সঠিকভাবে কাজ করতে আমাকে ত্রুটি_সামগ্রী বন্ধ করতে হয়েছিল । এটি অদ্ভুত লাগছে, তবে আমার ক্ষেত্রে সত্য। কারণ জেএসএন স্ট্রিংয়ের মধ্যে এমন কিছু বিজ্ঞপ্তি ছাপা হয়েছে যা আমি ডিকোড করার চেষ্টা করছি।


0

সর্বাধিক গুরুত্বপূর্ণ বিষয়টি মনে রাখতে হবে, যখন আপনি JSON ডেটা থেকে কার্যকর একটি নাল ফলাফল পাবেন যা বৈধ is নিম্নলিখিত কমান্ডটি ব্যবহার করা:

json_last_error_msg();

অর্থাৎ।

var_dump(json_last_error_msg());
string(53) "Control character error, possibly incorrectly encoded"

আপনি তারপরে এটি ঠিক করুন:

$new_json = preg_replace('/[[:cntrl:]]/', '', $json);

0

সুতরাং, html_entity_decode () আমার পক্ষে কাজ করেছে। এটি চেষ্টা করুন।

$input = file_get_contents("php://input");
$input = html_entity_decode($input);
$event_json = json_decode($input,true);

-5
<?php 
$json_url = "http://api.testmagazine.com/test.php?type=menu";
$json = file_get_contents($json_url);
$json=str_replace('},

]',"}

]",$json);
$data = json_decode($json);

echo "<pre>";
print_r($data);
echo "</pre>";
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.