【问题标题】:Simple JSON request in PHPPHP中的简单JSON请求
【发布时间】:2012-04-13 09:33:41
【问题描述】:

我有以下 json

country_code({"latitude":"45.9390","longitude":"24.9811","zoom":6,"address":{"city":"-","country":"Romania","country_code":"RO","region":"-"}})

我只想要 country_code,我该如何解析它?

我有这个代码

<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = file_get_contents($json);

var_dump(json_decode($jsonfile));
?>

它返回NULL,为什么?

谢谢。

【问题讨论】:

  • 在你做file_get_contents之后,你的$jsonfile变量的值是多少?
  • 执行var_dump($jsonfile) 并将输出添加到问题
  • var_dump($jsonfile) = string(144) "jsonpCallback({"latitude":"45.9390","longitude":"24.9811","zoom":6,"address":{" city":"-","country":"Romania","country_code":"RO","re​​gion":"-"}})"

标签: php file-get-contents json


【解决方案1】:
<?php
$jsonurl = "http://api.wipmania.com/json";
$json = file_get_contents($jsonurl);
var_dump(json_decode($json));
?>

你只需要 json 而不是 jsonp。
如果要返回数组,也可以尝试使用json_decode($json, true)

【讨论】:

  • 优秀。这是我一直在寻找的一种简单的解决方案。非常感谢您的简单回答。
【解决方案2】:

您正在使用 http://api.wipmania.com/jsonp?callback=jsonpCallback 请求 jsonp,它会返回一个包含 JSON 的函数,例如:

jsonpCallback({"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}})

而不是 JSON 本身。将您的 URL 更改为 http://api.wipmania.com/json 以返回纯 JSON,例如:

{"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}}

注意第二段代码没有将 json 包装在 jsonpCallback() 函数中。

【讨论】:

  • 什么??我从来没有听说过,所以那不是json?它看起来像一个
  • @RowMinds jsonpCallBack({"a":1}) 在你看来像 JSON 吗?
  • @RowMinds 它是 json,只是带有一些 PHP 无法理解的额外数据。
  • api.wipmania.com/json"; $jsonfile = file_get_contents($json);回声“
    ”; print_r(json_decode($jsonfile));回声 $jsonfile['country_code'];回显 $jsonfile->$country_code; ?> 这可能对我有帮助,但它不会工作
  • @RowMinds, country_codeaddress 下使用$jsonobject-&gt;address-&gt;country_code 到达那里...
【解决方案3】:

网站不返回纯 JSON,而是包装 JSON。这意味着作为脚本包含在内,并将调用回调函数。如果你想使用它,你首先需要删除函数调用(直到第一个括号和最后一个括号的部分)。

【讨论】:

  • 我可以用空格替换 jsonpCallback( 和 ) .... 但它会杀死我的处理器
  • 如果使用高效的方法(例如,子字符串方法),与 http 请求(获取 JSON 文件)所需的时间相比,删除字符串的回调部分所需的时间可以忽略不计.
【解决方案4】:

如果你的服务器实现了JSONP,它会假设回调参数是JSONP信号,结果类似于JavaScript函数,比如

jsonpCallback("{yada: 'yada yada'}")

然后,json_decode 将无法将 jsonpCallback("{yada: 'yada yada'}") 解析为有效的 JSON 字符串

【讨论】:

【解决方案5】:

如果 country_code( 以及右括号包含在您的 json 中,请删除它们。 这不是有效的 json 语法:json

【讨论】:

    【解决方案6】:

    返回的是 JSONP,而不是 JSON。 JSONP 用于 JavaScript 中的跨域请求。使用 PHP 时不需要使用它,因为不受跨域策略的影响。

    由于您从 file_get_contents() 函数获取字符串,您可以替换 country_code( 文本(这是响应的 JSONP 特定部分):

    <?php
    $json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
    $jsonfile = substr(file_get_contents($json)), 13, -1);
    
    var_dump(json_decode($jsonfile));
    ?>
    

    注意

    这可行,但 JKirchartz 的解决方案看起来更好,只需请求正确的数据,而不是弄乱不正确的数据。

    【讨论】:

    • @RowMinds 使用substr() 会产生不必要的开销,因为您可以从请求正确的数据开始。但它不会“杀死”任何东西,这是一件非常轻量级的事情。
    • api.wipmania.com/json"; $jsonfile = file_get_contents($json);回声“
      ”; print_r(json_decode($jsonfile));回声 $jsonfile['country_code'];回显 $jsonfile->$country_code; ?> 这可能对我有帮助......但它不会工作
    【解决方案7】:

    显然在这种情况下,使用正确的 URL 访问 API 将返回纯 JSON。

    "http://api.wipmania.com/json"

    很多人都在提供 API 的替代方案,而不是回答 OP 的问题,所以这里是为那些正在寻找一种在 PHP 中处理 jSONp 的方法的人提供的解决方案。

    首先,API 允许你指定一个回调方法,所以你可以使用 Jasper 的获取 jSON 子字符串的方法,也可以提供一个 json_decode 的回调方法,并修改结果以使用对 eval 的调用.这是 Jasper 代码示例的替代方案,因为我不喜欢模仿:

    $json = "http://api.wipmania.com/jsonp?callback=json_decode";
    $jsonfile eval(str_replace("(", "('", str_replace(")", "')", file_get_contents($json)))));
    
    var_dump($jsonfile);
    

    诚然,这似乎有点长,更不安全,并且不像 Jasper 的代码那样清晰:

    $json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
    $jsonfile = substr(file_get_contents($json)), 13, -1);
    
    var_dump(json_decode($jsonfile));
    

    然后 jSON "address":{"city":"-","country":"Romania","country_code":"RO","region":"-"} 告诉我们像这样访问 country_code:

    $jsonfile->{'address'}->{'country_code'};
    

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多