我可以解码包含PHP代码的JSON吗?

时间:2014-11-19 09:34:59

标签: php json parsing blade

是否可以使用包含PHP代码的JSON字符串,并将此字符串解码?

例如,这可以正常工作:

$array = ["page", "is-home", $_SERVER["REQUEST_URI"] == "/"];
var_export($array); 
// array (
//   0 => 'page',
//   1 => 'is-home',
//   2 => false,
// )

这不起作用:

$json = '["page", "is-home", $_SERVER["REQUEST_URI"] == "/"]';
$array = json_decode($json); // returns NULL
echo json_last_error_msg(); // Syntax error

第二个示例仅在 $ _ SERVER [" REQUEST_URI"] ==" /" 从json字符串中删除时才有效。

是否有办法使用json_decode解析此字符串,如果没有,是否有其他方法可以实现此目的?

非常感谢!

更新

必须解析 $ _ SERVER [" REQUEST_URI"] ==" /" 。我正在尝试扩展Blade Templating,以便我可以实现解析的函数,例如:

@add-request('page', 'is-home', $_SERVER["REQUEST_URI"] == '/')

更新#2

为了简化这个问题,我需要将一个字符串转换为一个对象。

$str = '["page", "is-home", $_SERVER["REQUEST_URI"] == "/"]'; // this is obtained by parsing the top blade extension (not important how)

从字符串我需要以下数组:

$array = ["page", "is-home", true / false ]

请记住,原始字符串理论上可以包含其中一个JSON值的任何PHP对象。

5 个答案:

答案 0 :(得分:0)

那是因为你在字符串中使用了一个未被解析的变量。此外,$_SERVER["REQUEST_URI"] == "/"会返回false。如果布尔false连接到字符串,则它将被转换为空字符串。

您应该将代码重写为以下内容:

// Is the request URI equal to "/"?
$reqUriTest = ($_SERVER["REQUEST_URI"] == "/");

// If boolean false is converted to a string, it will become an empty string.
// So we need to explicitly use values "true" or "false".
$reqUriStr = ($reqUriTest ? "true" : "false");

// Now we can insert $reqUriStr into the JSON string.
$json = '["page", "is-home", '.$reqUriStr.']';
$array = json_decode($json);

答案 1 :(得分:0)

我认为你是在正确的轨道,但不是试图通过单引号“模拟”解码,为什么不(为了你的概念证明)首先ENCODE,然后'echo'/'打印'它返回的值,然后解码以查看它返回的内容。

答案 2 :(得分:0)

为什么不使用json_encode()来获取json字符串??

// create json string by json_encode() from array
$json  = json_encode([
    "page",
    "is-home",
    $_SERVER["REQUEST_URI"] == "/"
]);
// decode the encoded string with no error, of course ....
$array = json_decode($json);

答案 3 :(得分:0)

正如您在输出中可以清楚地看到的那样,您的第一个数组根本不包含任何PHP。

$array = ["page", "is-home", $_SERVER["REQUEST_URI"] == "/"];

使用布尔值$array[2]自动填充false,而不是使用PHP代码填充。

所以,我们假设您不能在客户端上进行这样的计算(实际上,您也可以在javascript中进行此计算)。因此,您必须将其作为json字符串(正确编码)发送到服务器,解码,评估它,并将结果发回数组。

$json = '["page", "is-home", "$_SERVER[\"REQUEST_URI\"] == \"/\""]';
$array = json_decode($json);
$array[2]=eval($array[2]);

但请不要这样做!这是一个很大的安全漏洞。

相反,请随意提出一个新问题,了解如何在javascript中进行此计算

答案 4 :(得分:0)

根据您的情况,您可以这样做:

$is_home = $_SERVER["REQUEST_URI"] == "/";
$json = '["page", "is-home", '. $is_home .']';
$array = json_decode($json);