使用 json_decode 解码条带 json 不起作用

Posted

技术标签:

【中文标题】使用 json_decode 解码条带 json 不起作用【英文标题】:decoding stripe json with json_decode not working 【发布时间】:2012-05-17 08:50:46 【问题描述】:

我有来自条带的 json,我正在尝试将它解码为 json_decode。

我没有收到错误消息。只是什么都没有回来。我正在从条带中取回数据,但我无法对其进行解码。


   "created":1326853478,
   "data":
      "object":
         "amount":4500,
         "card":
            "country":"US",
            "cvc_check":"pass",
            "exp_month":7,
            "exp_year":2014,
            "fingerprint":"9aQtfsI8a17zjEZd",
            "id":"cc_00000000000000",
            "last4":"9782",
            "object":"card",
            "type":"Visa"
         ,
         "created":1322700852,
         "currency":"usd",
         "disputed":false,
         "fee":0,
         "id":"ch_00000000000000",
         "livemode":false,
         "object":"charge",
         "paid":true,
         "refunded":true
      
   ,
   "id":"evt_00000000000000",
   "livemode":false,
   "type":"charge.refunded"


// retrieve the request's body and parse it as JSON
$body = @file_get_contents('php://input');

$event_json = json_decode($body,true);
print_r($event_json);

有什么想法吗?

【问题讨论】:

是的。删除掩盖任何错误消息的字符。 Igancio 指的是@ 字符。 还要检查json_last_error() 和/或jsonlint.com,你可能有一个UTF-8 BOM 或其他东西。 【参考方案1】:

在这里,我运行了这个:

<?php
     $data = ' "created": 1326853478, "data":  "object":  "amount": 4500, "card":  "country": "US", "cvc_check": "pass", "exp_month": 7, "exp_year": 2014, "fingerprint": "9aQtfsI8a17zjEZd", "id": "cc_00000000000000", "last4": "9782", "object": "card", "type": "Visa" , "created": 1322700852, "currency": "usd", "disputed": false, "fee": 0, "id": "ch_00000000000000", "livemode": false, "object": "charge", "paid": true, "refunded": true  , "id": "evt_00000000000000", "livemode": false, "type": "charge.refunded" ';

    $arr = json_decode($data, true);

    print_r($arr);

?>

它奏效了。所以,理论上你应该可以使用:

<?php

    $arr = json_decode(file_get_contents('php://input'), true);

    print_r($arr);

?>

正如 Ignacio Vazquez-Abrams 所说,不要使用“@”字符,因为它会掩盖错误消息并使其更难调试。

我还会检查您拥有的 PHP 版本。 json_decode() 仅适用于 5.2.0 及更高版本。

【讨论】:

【参考方案2】:

php://input 流允许您从请求正文中读取原始数据。该数据将是一个字符串,根据请求中的值类型,将类似于:

"name=ok&submit=submit"

这是不是 JSON,因此不会按照您期望的方式解码为 JSON。如果无法解码,json_decode() 函数将返回 null

您从哪里获得您在上面发布的 JSON?这就是您需要传递给json_decode() 的值。

如果在请求中传递 JSON,例如在回调实例中,您仍然需要解析该部分以仅获取 JSON。如果php://input 流为您提供 name=ok&submit=submit&json="created": 1326853478 那么您必须将其解析出来。您可以使用 PHP 手册中的 this function 来分隔值,以便像 $_POST 数组一样工作:

<?php
   // Function to fix up PHP's messing up POST input containing dots, etc.
   function getRealPOST() 
      $pairs = explode("&", file_get_contents("php://input"));
      $vars = array();
      foreach ($pairs as $pair) 
         $nv = explode("=", $pair);
         $name = urldecode($nv[0]);
         $value = urldecode($nv[1]);
         $vars[$name] = $value;
      
      return $vars;
   
?>

使用它:

$post = getRealPOST();
$stripe_json = $post['json'];
$event_json = json_decode($stripe_json);

【讨论】:

以上是关于使用 json_decode 解码条带 json 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

似乎无法解码的 json 编码字符串

Json_decode:详解

json_decode()相关报错

PHP 获取JSON json_decode返回NULL解决办法

PHP 获取JSON json_decode返回NULL解决办法

json_decode 与 json_encode 的区别