【问题标题】:Issues with parsing response json output with php - Visa Developer API使用 php 解析响应 json 输出的问题 - Visa Developer API
【发布时间】:2021-11-16 22:52:52
【问题描述】:

我是 Visa 开发者平台 (VDP) API 的新手,在尝试使用 php 将响应的输出作为 json 读取时遇到了问题。我遵循了教程here。我正在使用Offers Data API

我的目标是能够生成要在前端显示的交易列表。我试图通过读取 json 输出并解析交易信息来做到这一点。

这是原始教程的内容,并且效果很好:

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_PORT, 443);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl, CURLOPT_SSLVERSION, 1);
curl_setopt($curl, CURLOPT_SSLCERT, $cert);
curl_setopt($curl, CURLOPT_SSLKEY, $key);

curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($curl);  //This output contains the json output as well

$response_info = curl_getinfo($curl); 

为了获取信息,我正在运行:$response_data = file_get_contents($response);,这似乎不起作用。由于输出的不仅仅是 json,还有其他信息,我无法运行:$arr = json_decode($response,true); 来解析 json。这是 json 的样子:

{"ReturnedResults":4,"StartIndex":1,"Offers":[{"indexNumber":1,"offerContentId":105515,"offerId":

等等。 json 以 {"indexNumber":1 开头,之前的所有内容都需要丢弃。 请让我知道我能做些什么来解决这个问题,或者是否有更好的方法来实现目标。谢谢!

【问题讨论】:

  • tutorial here...在哪里?没有提供链接。 Since the output it not just the json...那么它到底是什么样子的?举个例子。 what I can do to fix this...我们不知道,因为您没有链接到任何文档,没有向我们展示您提出的 cURL 请求,没有向我们展示您得到的响应或您期望的响应。我们根本不知道具体发生了什么。模糊的描述和部分细节不是有用的信息。请提供问题的minimal reproducible example,以便我们提供实际帮助。另请参阅How to Ask 以获得更一般的指导。谢谢。
  • 当响应不仅仅是 json 时,您必须以某种方式解析它,无论是通过提供的解决方案还是您自己的解决方案。注意:函数 file_get_contents 期望文件名参数不是响应内容,可以用作 curl 的部分替代,但那是另一个主题
  • 抱歉,发帖前忘记添加链接了。我更新了帖子。 @Kazz 有没有我可以使用的替代方案?也许我可以将信息存储在文件中然后读取文件?
  • 请重新阅读我的评论并提供所有所要求的信息,而不仅仅是其中的一部分。
  • 猜测,这可能是因为您设置了curl_setopt($curl, CURLOPT_VERBOSE, 1); - 这将使cURL 输出您在生产中不需要的各种调试信息。您应该删除该行,或者使用第二个选项将输出重定向到单独的流(按照stackoverflow.com/a/14436877/5947043 的说明)

标签: php json visa-api


【解决方案1】:

目标

json 以 {"indexNumber":1 开头,并且需要丢弃之前的所有内容。请让我知道我可以做些什么来解决这个问题,或者是否有更好的方法来实现目标。

代码

响应变量包含一个有效的 json 对象。由于您只需要Offers,您可以使用此代码获取Offers

$response = '{"ReturnedResults":4,"StartIndex":1,"Offers":[{"indexNumber":1,"offerContentId":105515,"offerId":""}]}';

$json = json_decode($response, true);
var_dump($json['Offers']);

输出

array(1) {
  [0]=>
  array(3) {
    ["indexNumber"]=>
    int(1)
    ["offerContentId"]=>
    int(105515)
    ["offerId"]=>
    string(0) ""
  }
}

【讨论】:

  • 这行得通! $json = json_decode($response, true); 是关键。从那里我使用了一个 foreach 循环来获取我需要的数据: foreach($offers as $x => &$offer) { print($offer["offerId"]."
    "); print($offer["offerTitle"]."
    "."
    "); }`
【解决方案2】:

使用CURLOPT_RETURNTRANSFER => true 初始化cURL - 然后您的内容将包含在$response 变量中。如果没有该选项,curl_exec 的结果总是布尔值。

【讨论】:

  • 我使用的是curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);,然后是$response = curl_exec($curl);。这部分有效,但它不是 json 格式。 file_get_contents($response) 的替代品可以在这里使用吗?
  • @MiPlayer123 你为什么要在响应时执行file_get_contents?我认为这样做没有任何意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多