T_DNUMBER在PHP中解码JSON时出错

时间:2017-09-01 20:11:42

标签: php json

这是我试图用PHP解码的JSON,但是遇到了问题。请检查下面的代码。

{ "146505212039213_2962095710480135": {
  "reactions_like": {
     "data": [
     ],
     "summary": {
        "total_count": 172595
     }
  },
  "reactions_love": {
     "data": [
     ],
     "summary": {
        "total_count": 75252
     }
  },
  "reactions_haha": {
     "data": [
     ],
     "summary": {
        "total_count": 132
     }
  },
  "id": "146505212039213_2962095710480135"
}}

我正在使用的代码:

function curl_get_contents($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$json = curl_get_contents('URL HERE');
$data = json_decode($json);
echo $data->146505212039213_2962095710480135->reactions_like->summary->total_count;

这是我得到的错误:

  

解析错误:语法错误,意外'146505212039213'(T_DNUMBER),   期待标识符(T_STRING)或变量(T_VARIABLE)或'{'或'$'   在第13行的C:\ xampp \ htdocs \ test.php

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

嗯,这个错误信息在这里真的很有帮助。解析器等待属性名称(应该是有效的标识符 - 这将数字作为第一个符号删除),或$字符(后跟标识符表达式)或{。然而它收到一个数字 - 并停止,茫然和困惑。

要将密钥用作属性名称,应将其转换为字符串。一种可能的方法是使用{' ... '}包装器:

echo $data->{'146505212039213_2962095710480135'}->...

Demo。或者,您可以将此字符串存储在变量中,并使用该变量:

$index = '146505212039213_2962095710480135';
echo $data->$index->...

我仍然强烈建议您考虑另一种方法:使用关联数组而不是对象。造成这种情况的一个特殊原因是众所周知的accessing numeric properties in objects问题。

$json = '{"146505212039213_2962095710480135":"test"}';
$data = json_decode($json, true); // use array, not object
echo $data['146505212039213_2962095710480135']; // test

答案 1 :(得分:0)

Identifiers/variable names can't begin with a number,因此$data->146505212039213_2962095710480135无效。

您需要做以下事情:

$index = '146505212039213_2962095710480135';
echo $data->$index->reactions_like->summary->total_count;

echo $data->{'146505212039213_2962095710480135'}->reactions_like->summary->total_count;