【问题标题】:is There a way to extract data from a URL that contains a json array in PHP有没有办法从包含 PHP 中的 json 数组的 URL 中提取数据
【发布时间】:2021-06-19 21:31:25
【问题描述】:

我有这个网址http://bisscloud.britain.edu.pk:8841/BISSJSon/JSonStudentsAll.aspx 其中包含 json 数组形式的数据,我想使用 php 提取数据,我尝试使用 file_get_contents

<?php
error_reporting(E_ALL);
$file = file_get_contents("http://bisscloud.britain.edu.pk:8841/BISSJSon/JSonStudentsAll.aspx");
$data = json_decode($file);
var_dump($data);

?>   

但它返回 null 我也尝试使用 CURL 但没有结果

【问题讨论】:

  • Warning: file_get_contents(http://bisscloud.britain.edu.pk:8841/BISSJSon/JSonStudentsAll.aspx): failed to open stream: Operation timed out in php shell code on line 1... 尝试在error_reporting 中使用E_ERROR | E_WARNING | E_PARSE 你应该会看到
  • 谢谢,这就是我得到的警告:file_get_contents(bisscloud.britain.edu.pk:8841/BISSJSon/JSonStudentsAll.aspx): failed to open stream: Connection denied in /home/themessa/public_html/lms/api/json.php on line 4
  • 嗨@Omen Khalid,我试试你的示例代码,我得到了一些内容。
  • 刚刚尝试访问该 URL,但似乎超时。因此,您的问题与 JSON 无关,URL 根本无法正常工作。从上面的各种报告来看,它非常不可靠
  • @cbrr09 你到底得到了什么

标签: php arrays json


【解决方案1】:

响应为 6.9 MB,包含 9767 条学生记录,这可能是大多数人响应超时的原因,服务器可能很难生成响应。如果您确实设法获得响应并尝试对其进行解码,json_decode 将返回 null,因为它无法解码 JSON。如果你使用JSON_THROW_ON_ERROR标志,或者检查json_last_error,你会发现JSON中有语法错误。

问题是有两条记录包含双反斜杠。反斜杠是 JSON 中的特殊字符,文字反斜杠必须使用...另一个反斜杠进行转义。所以在这两个元素中,\\ 需要是\\\\

{
      "StudentID": "10095",
      "RegistrationNo": "10078",
      "AdmissionDate": "01 Nov 2017",
      "StudentName": "Aaniya Tariq",
      "FatherName": "Tariq Shehzad",
      "Gender": "Female",
      "HomeAddress": "\\House No. 231-Block-H2, Johar Town",
      "HomePhone": "0324-4514622",
      "EmergencyPhone": "03064142718",
      "DateOfBirth": "24 Sep 2012",
      "ContactNo": "0324-4514622 ; 03064142718",
      "FamilyNo": "03064142718",
      "WebPassword": null,
      "CampusName": "Al-Muqeet Campus",
      "SessionYear": "2020-2021",
      "ClassTitle": "Level-III",
      "SectionTitle": "Green",
      "CampusID": "31",
      "SessionID": "12",
      "ClassID": "6",
      "SectionID": "1"
    },
    {
      "StudentID": "15929",
      "RegistrationNo": "15912",
      "AdmissionDate": "12 Oct 2020",
      "StudentName": "Fatima Tu Zahra \\ waseem Hashmi",
      "FatherName": "M. Waseem Hassan Hashmi",
      "Gender": "Female",
      "HomeAddress": "Punjab small Industries, Rawwal Road, Multan",
      "HomePhone": "N/A",
      "EmergencyPhone": "033152701010",
      "DateOfBirth": "16 Jan 2008",
      "ContactNo": "N/A ; 033152701010",
      "FamilyNo": "033152701010",
      "WebPassword": null,
      "CampusName": "Al-Awwal Campus",
      "SessionYear": "2020-2021",
      "ClassTitle": "Level-VIII",
      "SectionTitle": "Green",
      "CampusID": "9",
      "SessionID": "12",
      "ClassID": "11",
      "SectionID": "1"
    }

修复这两个语法错误让我能够解码 JSON 字符串。

$file = file_get_contents("http://bisscloud.britain.edu.pk:8841/BISSJSon/JSonStudentsAll.aspx");

try
{
    $data = json_decode($file, true, 512, JSON_THROW_ON_ERROR);
    echo sizeof($data['Students']) . PHP_EOL;
    var_dump($data);
}
catch (JsonException $e)
{
    echo 'Error code: '.$e->getCode().PHP_EOL;
    echo $e->getMessage().PHP_EOL;
}

【讨论】:

  • 我删除了双反斜杠,但仍然无法打开流:file_get_contents() 上的连接被拒绝错误,是 url 本身的问题,因为当我运行它时,它返回有效的 json 数据
  • 您是否使用相同的 url 成功解码了 json 字符串,如果是,那么我认为连接被拒绝问题出在我的服务器上,您能确认一下吗? @RobRuchte
  • 是的,我刚刚运行了我发布的代码,并且能够成功获取和解码响应。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多