2012-07-05 62 views
-1

我有以下的JSON字符串从节点JS服务回来:在PHP中解析JSON的正确方法是什么?

"{\"success\":true,\"isavailable\":true}" 

当我尝试使用在PHP我坐上的var_dump以下json_decode():

string '{"success":true,"isavailable":true}' (length=35) 

所以,我开始着手做到以下几点:

$str = str_replace("\"{", "'{", $str); 
$str = str_replace("}\"", "}'", $str); 
$str = str_replace('\"','"',$str); 

当我做到这一点我从返回语法错误上次错误和NULL值。

那么,在PHP中解析这个JSON字符串的正确方法是什么?

+2

'json_decode'适用于我:http://codepad.org/LIBC8ihP – 2012-07-05 19:00:29

+0

'json_decode'仅在PHP 5.2.0 +中可用? – AlexLittlejohn 2012-07-05 19:03:43

+0

@AlexLittlejohn为什么你会使用5.2.0以上的版本? – Lusitanian 2012-07-05 19:07:19

回答

1

正确的解决办法(假设输入正是在OP)是使用trim()摆脱领先和尾随双引号调用stripslashes()后:现在

$str = '"{\"success\":true,\"isavailable\":true}"'; 
$str = trim(stripslashes($str), '"'); 
var_dump(json_decode($str)); 

you get

object(stdClass)#1 (2) { ["success"]=> bool(true) ["isavailable"]=> bool(true) } 

我也确认这串似乎是双重编码,因此它也可以用正确解码:

$str = '"{\"success\":true,\"isavailable\":true}"'; 
var_dump(json_decode(json_decode($str))); 
+0

json_decode(stripslashes($ json_string));我猜也足够了。看到的额外双引号实际上并不是JSON字符串的一部分。 – Neo 2012-07-05 19:14:40

+0

@Neo - 如果没有'trim()',[因为我失败](http://viper-7.com/w7y0v8) – nickb 2012-07-05 19:16:49

+0

,因为你实际上在字符串中使用双引号两次。实际的字符串不会包含它两次。 – Neo 2012-07-05 19:17:50

0

$parsed = json_decode($whatever);

+0

为什么downvote?这是第一个答案,它是正确的。 – Joe 2012-07-05 19:03:19

+0

我想知道同样的事情...... – Lusitanian 2012-07-05 19:03:37

+4

@Joe:可能是因为托德提到他尝试过'json_decode',但它产生了一个字符串而不是一个对象。 – outis 2012-07-05 19:07:27

0

使用

json_decode(stripslashes($json_string)); 
+1

我使用这个时得到NULL。 – 2012-07-05 19:02:36

+0

$ a ='{\“success \”:true,\“isavailable \”:true}'; var_dump(json_decode(stripslashes($ a))); 这给出了正确的对象。 – Neo 2012-07-05 19:10:31

1
$obj = json_decode("{\"success\":true,\"isavailable\":true}"); 
echo $obj->success; 
echo $obj->isavailable; 

结果:

11 

这里1代表true(在你的JSON实际值),如truthy值。

您可以在此working example中看到演示。

+1

我试图获取非对象的属性错误 – 2012-07-05 19:04:17

+1

@ToddMoses:不,请参阅此处的工作示例:http://codepad.org/kGxUNabC – Blaster 2012-07-05 19:04:41

0

你的输入是无效的,假设:

$this = '"{\"success\":true,\"isavailable\":true}"'; 

是你真的有。

所以它不是一个真正的json_decode问题,而是斜线和尾部引号。

您可以通过更换或修剪,如上所述修复它。

$obj = json_decode(trim(stripslashes('"{\"success\":true,\"isavailable\":true}\"'), '"')); 

接取它只是做:

$obj->success 

$obj->isavailable 

您将获得1作为真正的是一个布尔值。

但个人而言,您应该考虑逃避响应,以避免JSON字符串的这些'黑客'。事物如同斜杠和引号,不应该发送未经转义。

如果这是您自己的JSON响应当然。

相关问题