【问题标题】:Get JSON from url with file_get_contents使用 file_get_contents 从 url 获取 JSON
【发布时间】:2016-11-24 11:20:54
【问题描述】:

我有一个以 JSON 格式提供一些数据的服务器。 我尝试用通常的方式获取这些数据:

$res = file_get_contents($url);
$result = json_decode($res);
var_dump($result);

但是 $result 仍然是一个字符串。 问题是来自 file_get_content 的数据在数据之前有一些字母数字字符串,在数据之后有一个零。

类似:

215ba
{"@attributes":{"ticker":"FCA"},"info...... // here all json data
0

我已经直接从 url 检查了 json 的有效性,并且格式正确,我不明白 0 和 215ba 来自哪里。

显然我可以去掉两个字符串,但我想知道是否有更具体的解决方案而不是解决方法

PS:很遗憾我不能使用 cURL

【问题讨论】:

  • 什么是编码类型?
  • $url 是我们提供动态数据的服务器之一的 url,但我已经通过 JSON 验证器检查了服务器的输出,并且正确且格式正确。来自浏览器的结果与来自 file_get_contents 的结果之间的唯一区别是开头的字母数字值和结尾的零
  • 编码类型为 UTF-8

标签: php json file-get-contents


【解决方案1】:

关于 json_decode 的文档注释:http://php.net/manual/en/function.json-decode.php

This function only works with UTF-8 encoded strings..

这样的事情可能会解决它:

$contents = file_get_contents($url);
$contents = utf8_encode($contents);
$results = json_decode($contents); 

如果这不起作用,您可以使用正则表达式来检查新行。假设 json 总是在 1 行。

<?php
$contents = file_get_contents($url);
$contents = utf8_encode($contents);
preg_match('/^.+[\n](.+)[\n]./', $contents, $matches);

//the json is in $matches[1]
print_r($matches);

【讨论】:

  • 它改变了输出吗?
  • @Plastic 可以共享 .json 文件。所以我们可以测试一下
  • 它很大,我在哪里可以粘贴?
  • 我看到你的编辑,我相信最后我会使用这个解决方案,它是我从一开始就最好的一个,如果有办法避免这种“解决方法”,我会徘徊更一致解决方案。
  • 是的,我确信它的发生是有原因的。但这应该始终有效,只要您将 json 放在 1 行
【解决方案2】:

可能是 JSON 包含 UTF8 字符,因此在文件开头使用 BOM 标记,并且您的 json_decode 函数在未启用多字节字符串的 PHP 中运行?

【讨论】:

  • 好像是这样,你知道去除它的有效方法吗?
【解决方案3】:

您一直面临的问题我很常见,理想情况下,当 json 数据格式不正确时会发生这种情况,例如字符串中包含不受支持的字符集或某些损坏的字符串。因此,只需尝试使用 UTF-8 支持解码您的文件内容,以便更安全且减少您的问题复杂化,您可以使用 php 中的utf8_encode() 函数或使用 curl 处理通过文件获得的 utf-8 内容.

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多