PHP 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()और यह ठीक काम किया)।

मैंने JSON को http://jsonlint.com/ के खिलाफ परीक्षण किया है और यह पूरी तरह से वैध है।

यहाँ क्या गलत है?

उपाय

Google पर उत्तरों की तलाश में, मैं SO पर वापस आ गया: json_decode webservice कॉल के बाद NULL देता है । मेरी JSON फ़ाइल में UTF BOM अनुक्रम (कुछ द्विआधारी वर्ण जो वहां नहीं होने चाहिए), इस प्रकार, JSON संरचना को तोड़ते हैं। हेक्स संपादक के पास गया, बाइट्स मिटा दिया। सब कुछ वापस सामान्य करने के लिए। ऐसा क्यों हुआ है? क्योंकि मैंने Microsoft Windows 'नोटपैड' का उपयोग करके फ़ाइल को संपादित किया। भयानक विचार!


5
PHP 5.2.9 के साथ काम करना; इस प्रकार, मैं उपयोग नहीं कर सकता json_last_error()
जोएल ए। विलारियल बर्टोल्डी

1
यह भी ध्यान दें कि यह फ़ाइल के मध्य में अन्य अमान्य वर्णों के साथ हो सकता है। मेरे पास सिर्फ json_decode () अशक्त लौट रहा था क्योंकि स्ट्रिंग में उन विशेष एन-डैश में से एक था, शायद एमएस वर्ड से चिपकाया गया था, और फिर शायद गलत एनकोड किया गया था। संभावित समस्या वर्णों की पहचान करने के लिए, JSON फ़ाइल खोलें (मैंने नोटपैड ++ में उपयोग किया है), एन्कोडिंग को बदलें (बिना परिवर्तित), और प्रतिलिपि के रूप में सहेजें। फिर दो फाइलों को अलग करें (मैंने WinMerge का इस्तेमाल किया)।
लिनसआर

(विंडोज नोटपैड मुद्दा) कृपया, इस से परामर्श करें, मैंने समस्या को भी साझा किया है और इसे ठीक किया है: stackoverflow.com/questions/10290849/…
फेलिक्स अबली


मेरे लिए, यह कुछ विशेष नहीं था, किसी वस्तु के तत्व के अंत में एक अतिरिक्त अल्पविराम। दूर ले जाओ: जो कुछ भी आपके JSON को असंगत बनाता है, वह एक त्रुटि फेंकने वाला है। बोनस टिप: jsonviewer.stack.hu पर भरोसा न करें। jsonlint जैसी किसी चीज़ का उपयोग करें
अमन आलम

जवाबों:


68

यह विशेष वर्णों का एन्कोडिंग हो सकता है। आप निश्चित जानकारी प्राप्त करने के लिए json_last_error () पूछ सकते हैं ।

अद्यतन: समस्या हल हो गई है, प्रश्न में "समाधान" पैराग्राफ को देखें।


मैंने विशेष वर्णों का उपयोग किया है क्योंकि मैंने आवेदन शुरू किया था और पहले कोई समस्या नहीं थी। स्थानीय रूप से, JSON डिकोडिंग पूरी तरह से काम करता है। मेरे सर्वर पर, यह नहीं है। और मैं कॉल नहीं कर सकता json_last_error()क्योंकि यह PHP 5.2.9 है। यह फ़ंक्शन PHP 5.3.0 पर दिखाई देता है।
जोएल ए। विलारियल बर्टोल्डी

1
नहीं, यह काम करना चाहिए। मैं अभी और परीक्षण नहीं कर सकता, अगर मैं इसे प्राप्त करता हूं तो बाद में मैं यहां पोस्ट करूंगा। उपयोगकर्ता द्वारा योगदान किए गए नोटों में कुछ संकेत भी हैं: de.php.net/json_decode शायद कुछ मदद करता है।
१६:१६ पर पक्के

1
मेरे लिए, PHP 5.3 पर, यह तब ठीक काम करता है जब टेक्स्ट UTF-8 में एनकोडेड होता है। लेकिन अगर मैं utf8_decode()पहले पाठ से गुजरता हूं , तो json_decode()चुपचाप विफल रहता है।
मैथ्यू

1
@Pekka Google पर उत्तरों की तलाश में, मैं SO पर वापस आ गया: stackoverflow.com/questions/689185/json-decode-returns-null-php । मेरी JSON फ़ाइल में UTF BOM अनुक्रम (कुछ द्विआधारी वर्ण जो वहां नहीं होने चाहिए), इस प्रकार, JSON संरचना को तोड़ते हैं। हेक्स संपादक के पास गया, बाइट्स मिटा दिया। सब कुछ वापस सामान्य करने के लिए। ऐसा क्यों हुआ है? क्योंकि मैंने माइक्रो $ टोट विंडोज 'नोटपैड' का उपयोग करके फ़ाइल को संपादित किया है। भयानक विचार!
जोएल ए। विलारियल बर्तोल्डी

2
यह PHP लोगों के लिए बग के रूप में रिपोर्ट किया जाना चाहिए। अगर BOM UTF8 वैध था, तो उसे चुपचाप नहीं जाना चाहिए।
jmucchiello

86

इसने मेरे लिए काम किया

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

2
मैंने इसका उपयोग किया है और इसे सरणी मिली है लेकिन मेरी भाषा के विशिष्ट वर्ण (ş, ç, ö, ..) को भी हटा दिया गया है।
ज़ानकोका

5
यदि json डेटा UTF-8 एन्कोडेड है (या कोई भी UTF एन्कोडिंग मुझे लगता है) यह सही नहीं है। यह मान्य UTF-8-एन्कोडेड डेटा को हटा देगा। यह संभवतः तब तक काम करेगा जब तक कि फ़ाइल में केवल अंग्रेजी भाषा शामिल है, लेकिन यह हमेशा एक जोखिम भरा अनुमान है। मैं इस का उपयोग नहीं करेगा।
DaedalusAlpha

इसके साथ यह काम करता है, लेकिन इसके बिना, दो स्ट्रिंग भी समान नहीं हैं, क्या मुझे कुछ याद आ रहा है?
रुडी विज़सर

यह वास्तव में कारगर है! लेकिन क्यों? जिस स्ट्रिंग को मैंने डिकोड करने की कोशिश की, उसमें कोई विशेष वर्ण नहीं था
तोबियस गस्समन

बहुत बढ़िया। मेरे लिए काम किया। :)
सोहिल

31

आप इसके साथ प्रयास कर सकते हैं।

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

मैंने गलती से stripslashes()दो बार कॉल किया, जो आवश्यक स्लैश को हटा दिया और अमान्य JSON स्ट्रिंग का कारण बना। इस उत्तर ने मुझे त्रुटि को हल करने में मदद की
फिलिप

22

यदि आप क्रोम में अनुरोध की जांच करते हैं तो आप देखेंगे कि JSON टेक्स्ट है, इसलिए JSON में रिक्त कोड जोड़ा गया है।

आप इसका उपयोग करके साफ़ कर सकते हैं

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

तो आप का उपयोग कर सकते हैं:

json_decode($k)

print_r फिर ऐरे को दिखाएगा।


इसके लिए धन्यवाद - आशा है कि आपको अपनी लापता अंग्रेजी मिलेगी।
डीन_विल्सन

यार तुम किंवदंती हो, सारा दिन इसी के साथ रही।
सोंबिसो मार्कस नजीमांडे

मेरे लिए यह किया !! मेरे द्वारा बनाया गया एक साधारण ट्विस्ट, इस का उपयोग करने के स्थान पर एक स्थान जोड़ रहा है, और यह मेरे स्थान को भी बदलने लगता है। अब ठीक काम करता है। $k=preg_replace('/\s+/', ' ',$k);
काश

समस्या यह है, यह हर एक स्थान को हटा देता है, जिससे अंग्रेजी पाठ एक साथ अटक जाता है?
कोडगुरु

14

मुझे एक ही समस्या थी और मैंने इसे डिकोड से पहले उद्धरण चरित्र को बदलकर बस हल कर दिया।

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

मेरा JSON मान JSON.stringify फ़ंक्शन द्वारा उत्पन्न किया गया था।


इस स्थिति में संभवतः HTMLspecialchars का उपयोग किया जा रहा है और JSON को अब पार्स नहीं किया जा सकता है। इसे उलटने के लिए मैन्युअल रूप से प्रतिस्थापित & quot के बजाय "htmlspecialchars_decode" फ़ंक्शन है;
डेवी

11

हो सकता है कि कुछ छिपे हुए पात्र आपके जोंस के साथ खिलवाड़ कर रहे हों, यह कोशिश करें:

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

उपरोक्त सभी समाधानों की कोशिश करने के बाद, यह आखिरकार मेरे लिए काम कर गया। अनेक अनेक धन्यवाद!!
अनीस आर।


4

जैसा मैंने सोचा था कि आज मैं इस मुद्दे में भाग गया, मैं इसे जोड़ दूंगा। अगर आपके JSON स्ट्रिंग के आसपास कोई स्ट्रिंग पैडिंग है, तो json_decode NULL को लौटा देगा।

यदि आप PHP चर के अलावा किसी अन्य स्रोत से JSON खींच रहे हैं, तो पहले इसे "ट्रिम" करना बुद्धिमानी होगी:

$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 घंटे बिताए कि यह सिर्फ html एन्कोडिंग समस्या थी। इसे इस्तेमाल करे

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) यह उन सभी मुद्दों को तय करता है जो मैं कर रहा था।

भविष्य के नोड के रूप में, JSON ऑब्जेक्ट मैं डिकोडिंग पायथन के json.dumps फ़ंक्शन से आया था। बदले में इसने कुछ अन्य अस्वाभाविक डेटा को पार कर लिया हालांकि इसे आसानी से निपटा दिया गया था।


1

यदि आपको डेटाबेस से json मिल रहा है, तो डालें

mysqli_set_charset($con, "utf8");

कनेक्शन को परिभाषित करने के बाद लिंक $ con


साभार- टॉमोमीहा यह वही है जो MySQL के साथ मेरी सभी समस्याओं को फिट करता है जिसमें विशेष वर्ण होते हैं और जब json_decode द्वारा परिवर्तित किया जाता है, तो उस विशेष क्षेत्र में = null
KLL


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 प्रिंट करके इस समस्या को हल किया है, और फिर पृष्ठ स्रोत (CTRL / CMD + U) की जांच कर रहा हूं:

print_r(file_get_contents($url));

पता चला कि एक अनुगामी <pre>टैग था।


0

आपको इन बिंदुओं को सुनिश्चित करना चाहिए

1. आपके json string में कोई अज्ञात अक्षर नहीं है

2। json string ऑनलाइन json दर्शक से देख सकते हैं (आप google पर ऑनलाइन दर्शक या jser के लिए पार्सर के रूप में खोज सकते हैं) इसे बिना किसी त्रुटि के देखना चाहिए

3। आपके स्ट्रिंग में html एंटिटीज़ नहीं हैं, यह प्लेन टेक्स्ट / स्ट्रिंग होना चाहिए

बिंदु 3 की व्याख्या के लिए

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

करने के लिए (निकालें htmlentities () फंक्शन)

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

0

मेरे लिए, मुझे सही ढंग से काम कर रहे json_decode () प्राप्त करने के लिए error_reporting को बंद करना पड़ा । यह अजीब लगता है, लेकिन मेरे मामले में सच है। क्योंकि JSON स्ट्रिंग के बीच कुछ नोटिस छपा है जिसे मैं डिकोड करने का प्रयास कर रहा हूं।


0

याद रखने वाली सबसे महत्वपूर्ण बात, जब आपको JSON डेटा से एक NULL परिणाम मिलता है जो कि मान्य है, तो निम्न कमांड का उपयोग करना है:

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>";
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.