json_decode返回带有效json的语法错误

时间:2016-06-01 16:18:01

标签: php json

我试图解码我用jsonlint检查的以下json并返回它是一个有效的json:

  

[{" gatewayId":" 5154979870408704"," sensorId":" 5698497110081536"},{" timestamp&#34 ;:" 20160513T225959000Z"," tagId":" 123456789AB1"," io":" in"},{& #34; timestamp":" 20160513T235959000Z"," tagId":" 123456789AB2"," io":" out&# 34;}]

但是当我调用json_last_error_msg()时,结果总是语法错误 这是我的代码:

$param = substr($HTTP_RAW_POST_DATA, 1);
$param =utf8_encode($param);
$json = json_decode($param,true);
echo json_last_error_msg();
var_dump($param);

json正在使用curl发送给我,这就是为什么它在$ HTTP_RAW_POST_DATA中,并且我删除了第一个字符,因为在创建var_dump时我注意到那里有一个空白字符,但是那不是问题。任何帮助表示赞赏。 修改 这是var_dump($ HTTP_RAW_POST_DATA)

的结果
  

string(187)" [{gatewayId:5154979870408704,sensorId:5698497110081536},{timestamp:20160513T225959000Z,tagId:123456789AB1,io:in},{timestamp:20160513T235959000Z,tagId:123456789AB2,io:out}]"

EDIT2: 事实证明,这是因为在具有有效载荷的卷曲请求中删除了双引号

-d "[{"gatewayId": "5154979870408704", "sensorId": "5698497110081536"}, {"timestamp": "20160513T225959000Z", "tagId": "123456789AB1", "io": "in"}, {"timestamp": "20160513T235959000Z", "tagId": "123456789AB2", "io": "out"}]"

我在有效负载的开头和结尾用单引号替换双引号,现在它工作正常,只是留下这个以防万一有人有同样的问题。 新的有效载荷:

-d '[{"gatewayId": "5154979870408704", "sensorId": "5698497110081536"}, {"timestamp": "20160513T225959000Z", "tagId": "123456789AB1", "io": "in"}, {"timestamp": "20160513T235959000Z", "tagId": "123456789AB2", "io": "out"}]'

谢谢!

1 个答案:

答案 0 :(得分:0)

var_dump我读过

string(187) " [{gatewayId: 5154979870408704, ...

此处未引用密钥gatewayIdJSON standard要求密钥为使用""的字符串。因此数据无效JSON,PHP拒绝它。