【问题标题】:Can't decode JSON value in PHP无法在 PHP 中解码 JSON 值
【发布时间】:2015-07-01 10:36:37
【问题描述】:

我没有找到解决办法。

我有一个 API 女巫给我 JSON 响应,

http://api.vajehyab.com/v2/public/?q=%D8%B3%D9%84%D8%A7%D9%85&developer=stackoverflow

是这样的,

{"搜索":{"q":"\u0633\u0644\u0627\u0645","code":200},"数据":{"title":"\u0633\u0644\u0627\u0645" ,"发音":"","文本":"(\u0633\u064e) [ \u0639 . ] (\u0645\u0635 \u0644 .) 1 - \u062f\u0631\u0648\u062f \u06af\u0641\u062a\ u0646 . 2 - \u0628\u06cc \u06af\u0632\u0646\u062f \u0634\u062f\u0646 . 3 - \u06af\u0631\u062f\u0646 \u0646\u0647\u0627\u062f\u0646 3.\u062f\u0646 3.\u06 u0644\u06cc\u06a9 \u062f\u0631\u0648\u062f \u0628\u0631 \u062a\u0648 \u0628\u0627\u062f. \u061b ~ \u0639\u0644\u06cc\u06a9\u0631\u068\u0645\u06\u\u062f u0628\u0631\u0634\u0645\u0627. ","来源":"\u0641\u0631\u0647\u0646\u06af \u0641\u0627\u0631\u0633\u06cc \u0645\u0639\u06cc\u06646|\u0648\u \u0698\u0647 \u06cc\u0627\u0628","永久链接":"?q=%D8%B3%D9%84%D8%A7%D9%85"},"错误":{"消息":"" ,"原因":""},"广告":{"text":"","url":""}}

似乎没有问题,我可以用PHP以外的其他工具解码它,我不能用PHP解码它

$json = file_get_contents('http://api.vajehyab.com/v2/public/?q='.urlencode('سلام').'&developer=stackoverflow');
var_dump(json_decode($json)); // null

我希望有人可以帮助我, 谢谢...

【问题讨论】:

  • 使用 json_last_error()。并检查错误代码。
  • 我按照@Stanimir 说的做了,是- Syntax error, malformed JSON
  • 在 PHP 5.5.21 上为我工作,那么可能是 PHP 版本的问题。

标签: php json decode decoding


【解决方案1】:

取自 php 文档http://php.net/manual/bg/function.json-last-error.php 运行此代码并让我们知道您是否收到任何错误。

json_decode($string);

switch(json_last_error())
{
    case JSON_ERROR_DEPTH:
        echo ' - Maximum stack depth exceeded';
    break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' - Unexpected control character found';
    break;
    case JSON_ERROR_SYNTAX:
        echo ' - Syntax error, malformed JSON';
    break;
    case JSON_ERROR_NONE:
        echo ' - No errors';
    break;
}

【讨论】:

  • 嗨,我是- Syntax error, malformed JSON,:|我现在该怎么办 ? :-/
【解决方案2】:

EDIT2:在 PHP 5.3+ 中,这似乎也可以:

$json = file_get_contents('http://api.vajehyab.com/v2/public/?q='.urlencode('سلام').'&developer=stackoverflow');

$unescaped = json_encode(preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
    return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
}, $json));
var_dump($unescaped);

取自:https://stackoverflow.com/a/24933162/2433843

EDIT3:将preg_replace_callback 包裹在json_encode

【讨论】:

  • 不,json_decode 仍然返回 null ! jsonlint 验证它们,但 PHP 说它不是:|
  • 对不起@EmadGhasemi,试试这个:$unescaped = json_encode(preg_replace_callback('/\\\\u(\w{4})/', function ($matches) { return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8'); }, $json));
  • 你说得对,感觉有点老套,但它似乎被解释为好像一开始就没有正确编码(我知道,它在 JS Linters 中确实有效)。也许在服务器端解决它会更好,但也许这是 PHP json 实现中的一个缺陷。这似乎对我有用,但我理解它是否太脏而无法实施。我有兴趣看到干净的解决方案!
  • 似乎他们使用的是 php 5.5.9,并且 cmets 中有人提到它在 5.5.21 中没有问题。 5.5.x 中的 json_encode 可能出了点问题:-/
  • 好的。你试过上面的代码吗?对不起,如果它不起作用;在这里它适用于 PHP 5.6.4-4ubuntu6(本地开发环境)
【解决方案3】:

请检查一下。

echo htmlentities((string)$results); 

也可以参考Problem with json_decode PHP

【讨论】:

    【解决方案4】:

    我认为问题出在file_get_contents 函数上。 json_decode 在输入为字符串时工作正常。下面的代码运行正常。

    $json = '{"search":{"q":"\u0633\u0644\u0627\u0645","code":200},"data":{"title":"\u0633\u0644\u0627\u0645","pronunciation":"","text":"(\u0633\u064e) [ \u0639 . ] (\u0645\u0635 \u0644 .) 1 - \u062f\u0631\u0648\u062f \u06af\u0641\u062a\u0646 . 2 - \u0628\u06cc \u06af\u0632\u0646\u062f \u0634\u062f\u0646 . 3 - \u06af\u0631\u062f\u0646 \u0646\u0647\u0627\u062f\u0646 . \u061b ~ \u0639\u0644\u06cc\u06a9 \u062f\u0631\u0648\u062f \u0628\u0631 \u062a\u0648 \u0628\u0627\u062f. \u061b ~ \u0639\u0644\u06cc\u06a9\u0645 \u062f\u0631\u0648\u062f \u0628\u0631 \u0634\u0645\u0627. ","source":"\u0641\u0631\u0647\u0646\u06af \u0641\u0627\u0631\u0633\u06cc \u0645\u0639\u06cc\u0646 | \u0648\u0627\u0698\u0647 \u06cc\u0627\u0628","permalink":"?q=%D8%B3%D9%84%D8%A7%D9%85"},"error":{"message":"","reason":""},"ads":{"text":"","url":""}}';
    var_dump(json_decode($json));
    

    【讨论】:

    • 我也试过用 CURL 功能,但它不起作用。
    【解决方案5】:

    请先将您的数据编码为 utf8 格式,然后再通过 json_encode() php 函数进行编码。我希望,它有帮助。 [utf8_encode()]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2017-11-14
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2017-05-12
      相关资源
      最近更新 更多