【问题标题】:json_decode behaving unpredictablyjson_decode 行为不可预测
【发布时间】:2013-06-26 01:48:08
【问题描述】:

我正在用 php 构建一个公共 API,并且遇到了 json_decode() 的一个非常奇怪的问题。我带来了一大串 JSON,我正在动态形成并且在这个过程中遇到了很多麻烦。我正在尝试像这样加载 JSON 对象:

$all_related_users_obj = json_decode($this->get_related_users_raw_JSON($user_id));
if(is_object($all_related_users_obj)) echo $all_related_users_obj->tags[0]->first_name;
else echo "NOT AN OBJECT";

我发现这适用于我传递的 $user_id 整数的大约一半,但不适用于其余部分。通常我会假设我的 JSON 只是格式错误,但根据 JSONlint,我的所有 JSON 格式都正确。

created a gist 的 JSON 文件示例正确加载到 $all_related_users_obj 和一个没有。

使用json_last_error() 函数我收到JSON_ERROR_UTF8 说明JSON 包含Malformed UTF-8 characters, possibly incorrectly encoded。但是,我仍然找不到错误。

非常感谢您的帮助。

【问题讨论】:

  • 不是阅读所有 JSON。让他们通过差异工具。
  • @IgnacioVazquez-Abrams 你的意思是用 gist 以外的东西发布它们吗?我也试过jsonformatter.curiousconcept.com
  • @IgnacioVazquez-Abrams 我使用了您提供的链接,但 JSON 值不同,因此这表明很多事情都不同。此外,如果我将一个给我带来问题的 JSON 字符串硬编码到我的 php 中,它 json_decode()s 正确...

标签: php parsing utf-8 json


【解决方案1】:

在您的“不工作”示例中,深埋在 JSON 中的键之一是:

"city":"Rezé",

这包含非 ASCII 字符 é。 JSON 可能以非 UTF8 编码(可能是 ISO8859-1)的形式提交,这导致 json_decode() barf。

【讨论】:

  • 非常感谢。很抱歉您必须阅读该内容...我将使用 $input = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($input)) 来解决此问题。
  • +1 用于读取 26,655 个字符以找到它。虽然我怀疑你没有。不过还是 +1。
  • @PhpMyCoder:是的,我没那么有耐心。粘贴到 vim 中,搜索 [^ -~] 以匹配所有不可打印的 ASCII 字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 2019-06-14
  • 2015-03-19
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多