PHP json_decode() returns NULL with valid JSON?

PhpJsonNull

Php Problem Overview


I have this JSON object stored on a plain text file:

{
	"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"
	}
}

When I try to decode it with json_decode(), it returns NULL. Why? The file is readable (I tried echoing file_get_contents() and it worked ok).

I've tested JSON against http://jsonlint.com/ and it's perfectly valid.

What's wrong here?

Update (response valid to my 2010 problem)

Looking for answers on Google, I got back to SO: https://stackoverflow.com/questions/689185/json-decode-returns-null-php. My JSON file had the UTF BOM sequence (some binary chars that shouldn't be there), thus, breaking the JSON structure. Went to Hex Editor, erased the bytes. Everything's back to normal. Why has this happened? Because I edited the file using Microsoft Windows' Notepad. Terrible idea!

Php Solutions


Solution 1 - Php

This worked for me

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

Solution 2 - Php

It could be the encoding of the special characters. You could ask json_last_error() to get definite information.

> Update: The issue is solved, look at the "Solution" paragraph in the question.

Solution 3 - Php

You could try with it.

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

Solution 4 - Php

If you check the the request in chrome you will see that the JSON is text, so there has been blank code added to the JSON.

You can clear it by using

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

Then you can use:

json_decode($k)

print_r will then show the array.

Solution 5 - Php

Maybe some hidden characters are messing with your json, try this:

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

Solution 6 - Php

I had the same problem and I solved it simply by replacing the quote character before decode.

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

My JSON value was generated by JSON.stringify function.

Solution 7 - Php

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

did it for me. And yes, testing on Chrome. Thx to user2254008

Solution 8 - Php

this help you to understand what is the type of error

<?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;
}
?>

Solution 9 - Php

Just thought I'd add this, as I ran into this issue today. If there is any string padding surrounding your JSON string, json_decode will return NULL.

If you're pulling the JSON from a source other than a PHP variable, it would be wise to "trim" it first:

$jsonData = trim($jsonData);

Solution 10 - Php

For me the php function stripslashes() works when receiving json from javascript. When receiving json from python, the second optional parameter to the json_decode call does the trick since the array is associative. Workes for me like a charm.

$json = stripslashes($json); //add this line if json from javascript
$edit = json_decode($json, true); //adding parameter true if json from python

Solution 11 - Php

Just save some one time. I spent 3 hours to find out that it was just html encoding problem. Try this

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);

Solution 12 - Php

Here is how I solved mine https://stackoverflow.com/questions/17219916/64923728 .. The JSON file has to be in UTF-8 Encoding, mine was in UTF-8 with BOM which was adding a weird &65279; to the json string output causing json_decode() to return null

Solution 13 - Php

The most important thing to remember, when you get a NULL result from JSON data that is valid is to use the following command:

json_last_error_msg();

Ie.

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

You then fix that with:

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

Solution 14 - Php

As stated by Jürgen Math using the preg_replace method listed by user2254008 fixed it for me as well.

This is not limited to Chrome, it appears to be a character set conversion issue (at least in my case, Unicode -> UTF8) This fixed all the issues i was having.

As a future node, the JSON Object i was decoding came from Python's json.dumps function. This in turn caused some other unsanitary data to make it across though it was easily dealt with.

Solution 15 - Php

If you are getting json from database, put

mysqli_set_charset($con, "utf8");

after defining connection link $con

Solution 16 - Php

I've solved this issue by printing the JSON, and then checking the page source (CTRL/CMD + U):

print_r(file_get_contents($url));

Turned out there was a trailing <pre> tag.

Solution 17 - Php

you should ensure these points

1. your json string dont have any unknowns characters

2. json string can view from online json viewer (you can search on google as online viewer or parser for json) it should view without any error

3. your string dont have html entities it should be plain text/string

for explanation of point 3

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

to (remove htmlentities() function )

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

Solution 18 - Php

Here you can find little JSON wrapper with corrective actions that addresses BOM and non-ASCI issue: https://stackoverflow.com/a/43694325/2254935

Solution 19 - Php

For my case, it's because of the single quote in JSON string.

JSON format only accepts double-quotes for keys and string values.

Example:

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

I got this confused because of Javascript syntax. In Javascript, of course, we can do like this:

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

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

but later when convert those objects to JSON string:

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

Solution 20 - Php

For me, I had to turn off the error_reporting, to get json_decode() working correctly. It sounds weird, but true in my case. Because there is some notice printed between the JSON string that I am trying to decode.

Solution 21 - Php

So, html_entity_decode() worked for me. Please try this.

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

Solution 22 - Php

It took me like an hour to figure it out, but trailing commas (which work in JavaScript) fail in PHP.
This is what fixed it for me:

str_replace([PHP_EOL, ",}"], ["", "}"], $JSON);

Solution 23 - Php

I recommend creating a .json file (ex: config.json). Then paste all of your json object and format it. And thus you will be able to remove all of that things that is breaking your json-object, and get clean copy-paste json-object.

Solution 24 - Php

  • I also face the same issue...
  • I fix the following steps... 1) I print that variable in browser 2) Validate that variable data by freeformatter 3) copy/refer that data in further processing
  • after that, I didn't get any issue.

Solution 25 - Php

I had exactly the same problem But it was fixed with this code

$zip = file_get_contents($file);
$zip = json_decode(stripslashes($zip), true);

Solution 26 - Php

In my case , i was facing the same issue , but it was caused by slashes inside the json string so using

json_decode(stripslashes($YourJsonString))

OR

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

If the above doesnt work, first replace the quotes from html quote , this might be happening if you are sending data from javascript to php

    $YourJsonString = stripslashes($YourJsonString);
    $YourJsonString = str_replace('&quot;', '"', $YourJsonString);
    $YourJsonString = str_replace('["', '[', $YourJsonString);
    $YourJsonString = str_replace('"]', ']', $YourJsonString);
    $YourJsonString = str_replace('"{', '{', $YourJsonString);
    $YourJsonString = str_replace('}"', '}', $YourJsonString);
    $YourJsonObject = json_decode($YourJsonString);

Will solve it,

Solution 27 - Php

Before applying PHP related solutions, validate your JSON format. Maybe that is the problem. Try this online JSON format validator. https://jsonformatter.org/

Solution 28 - Php

I had the same issue and none of the answers helped me. One of the variables in my JSON object had the value Andaman & Nicobar. I removed this & and my code worked perfectly.

Solution 29 - Php

It's probably BOM, as others have mentioned. You can try this:

    // BOM (Byte Order Mark) issue, needs removing to decode
    $bom = pack('H*','EFBBBF');
    $response = preg_replace("/^$bom/", '', $response);
    unset($tmp_bom);
    $response = json_decode($response);

This is a known bug with some SDKs, such as Authorize.NET

Solution 30 - Php

<?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>";
?>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoel A. Villarreal BertoldiView Question on Stackoverflow
Solution 1 - PhpDunith DhanushkaView Answer on Stackoverflow
Solution 2 - PhpPekkaView Answer on Stackoverflow
Solution 3 - PhpGabriel Castillo PradaView Answer on Stackoverflow
Solution 4 - Phpuser2254008View Answer on Stackoverflow
Solution 5 - PhpAlbert AbdonorView Answer on Stackoverflow
Solution 6 - PhpYapp Ka HoweView Answer on Stackoverflow
Solution 7 - PhpJürgen MathView Answer on Stackoverflow
Solution 8 - PhpEnrico TempestiView Answer on Stackoverflow
Solution 9 - PhpPhil LaNasaView Answer on Stackoverflow
Solution 10 - PhpNimView Answer on Stackoverflow
Solution 11 - PhpSamuel Kwame AntwiView Answer on Stackoverflow
Solution 12 - PhpKolawole Emmanuel IzzyView Answer on Stackoverflow
Solution 13 - PhpGrantView Answer on Stackoverflow
Solution 14 - PhpDestreyfView Answer on Stackoverflow
Solution 15 - PhpTomoMihaView Answer on Stackoverflow
Solution 16 - PhpJeffrey RoosendaalView Answer on Stackoverflow
Solution 17 - PhpHassan SaeedView Answer on Stackoverflow
Solution 18 - PhpKrzysztof PrzygodaView Answer on Stackoverflow
Solution 19 - PhpThoView Answer on Stackoverflow
Solution 20 - Phpshasi kanthView Answer on Stackoverflow
Solution 21 - PhpSuman DeolView Answer on Stackoverflow
Solution 22 - PhpNeoTechniView Answer on Stackoverflow
Solution 23 - Phpuser419685View Answer on Stackoverflow
Solution 24 - PhpAshish SondagarView Answer on Stackoverflow
Solution 25 - Phphasan akbariView Answer on Stackoverflow
Solution 26 - Phpuser2882971View Answer on Stackoverflow
Solution 27 - PhpnamalView Answer on Stackoverflow
Solution 28 - Phpdevanshi singhView Answer on Stackoverflow
Solution 29 - PhpDario ZadroView Answer on Stackoverflow
Solution 30 - Phpuser2648057View Answer on Stackoverflow