PHP JSON_decode()返回看似有效的 JSON 的 NULL?

我将这个 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,它是完全有效的。

怎么了?

305404 次浏览

它可能是特殊字符的编码。您可以请求 < strong > json _ last _ error () 获得确切的信息。

如果您检查 chrome 中的请求,您将看到 JSON 是文本,因此在 JSON 中添加了空白代码。

您可以使用

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

然后你可以使用:

json_decode($k)

然后,print_r将显示数组。

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

今天碰到这个问题,我想加上这个。如果在 JSON 字符串周围有任何字符串填充,JSON _ decode 将返回 NULL。

如果您从 PHP 变量以外的源中提取 JSON,那么首先“修剪”它将是明智的:

$jsonData = trim($jsonData);

我有同样的问题,我解决了它只是通过替换前解码引号字符。

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

我的 JSON 值是由 JSON.stringify 函数生成的。

这招对我很管用

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

如果要从数据库中获取 json,请将

mysqli_set_charset($con, "utf8");

在定义连接链接 $con 之后

省点时间吧。我花了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);

你可以试试。

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

也许有些隐藏的角色在欺骗你的儿子,试试这个:

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

我已经通过打印 JSON,然后检查页面源代码(CTRL/CMD + U)解决了这个问题:

print_r(file_get_contents($url));

后面有个 <pre>标签。

这有助于你了解什么是错误的类型

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

你应该确保这些点

1. json 字符串没有任何未知字符

2.Json 字符串可以从在线 json 查看器(你可以作为在线查看器或 json 解析器在 google 上搜索)它应该查看没有任何错误

3. 你的字符串没有 html 实体,它应该是纯文本/字符串

解释第三点

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

设置为 (移除 htmltity ()函数)

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

对于我来说,这是因为 JSON 字符串中只有一个引号。

JSON 格式只接受键和字符串值的双引号。

例如:

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

由于 Javascript 语法的原因,我对此感到困惑,当然,在 Javascript 中,我们可以这样做:

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

对我来说,我必须关闭 Error _ Reporting 错误报告,才能使 json _ decode ()正常工作。听起来很奇怪,但对我来说是真的。因为在我试图解码的 JSON 字符串之间打印了一些通知。

当您从有效的 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);

所以,html _ tity _ decode ()对我来说是可行的,请试试这个。

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

我花了大约一个小时才弄明白,但是在 PHP 中,后面的逗号(在 JavaScript 中可以使用)不起作用。
这就是为什么我这么做的原因:

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

下面是我如何解决我的 https://stackoverflow.com/questions/17219916/64923728。.JSON 文件必须使用 UTF-8编码,我的文件使用 UTF-8编码,BOM 在 JSON 字符串输出中添加了一个奇怪的 & 65279;,导致 json_decode()返回 null

我建议创建一个. json 文件(例如 config.json)。 然后粘贴所有的 json 对象和 格式。因此,您将能够删除所有破坏 json-object 的东西,并获得干净的复制粘贴 json-object。

  • 我也面临着同样的问题。
  • 我修正了以下步骤... 1)在浏览器中打印该变量2)通过 自由格式化程序验证该变量数据3)在进一步处理中复制/引用该数据
  • 在那之后,我没有任何问题。

我也有同样的问题 但是用这个密码修好了

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

在我的例子中,我遇到了同样的问题,但是它是由 json 字符串中的斜杠引起的

json_decode(stripslashes($YourJsonString))

或者

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

如果上面的方法不起作用,那么首先替换 html 引号中的引号,如果您将数据从 javascript 发送到 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);

会解决的,

在应用 PHP 相关解决方案之前,验证您的 JSON 格式。

对我来说,php 函数 stripslash ()在从 javascript 接收 json 时工作。当从 python 接收 json 时,json _ decode 调用的第二个可选参数起作用,因为数组是关联的。对我很有效。

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

我也有同样的问题,但没有一个答案对我有帮助。 我的 JSON 对象中的一个变量的值为 Andaman & Nicobar。我删除了这个 &,我的代码工作得很完美。

它可能是 BOM,就像其他人提到的那样。你可以试试这个:

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

这是一个已知的带有某些 SDK 的 bug,例如 Authorize.NET

之所以会发生这种情况,是因为在值或键中使用了(’) insted {”。

这是错误的格式。

{'name':'ichsan'}

如果您解码它们,它们将返回 NULL。

您应该像这样传递 json 请求。

{"name":"ichsan"}

这个错误意味着您的 JSON 字符串不是有效的 JSON!

当发生错误时启用抛出异常,PHP 将抛出一个带有失败原因的异常。

用这个:

$json = json_decode($string, null, 512, JSON_THROW_ON_ERROR);