【问题标题】:Error decoding JSON input via json_decode通过 json_decode 解码 JSON 输入时出错
【发布时间】:2013-03-04 00:56:51
【问题描述】:

我正在编写我的第一个 Web 服务,但我遇到了与 JSON 数据传递相关的问题。我的 Web 服务分为两个文件:controller.php,其中包含服务处理程序,以及 service.php,其中包含应请求提供的类和方法.

这是来自 controller.php 的 acquisition 片段:

    public function atender() {
        // pre-procesamos la petición
        if (!empty($_POST)) {
            if (!empty($_POST["class"]) && !empty($_POST["action"]) && !empty($_POST["function"])) {
                $clase = ucwords($_POST["class"]);
                $metodo = "{$_POST["action"]}{$this->obtenerMetodo($_POST["function"])}";
                $id = (!empty($_POST["datos"]) ? stripslashes($_POST["datos"]) : null);

我可以在 GET 和 POST 模式下处理请求(我将 GET 用于不需要身份验证的方法,例如 getCategoriesgetCategoryByIdgetProductsgetProductById。这些是获取寿司店菜品类别和菜品的方法。)

对于任何 GET 请求,一切都按预期进行。当我处理 POST 请求时,我的问题就出现了。我需要以 JSON 格式获取所有 URL 参数,因为这是为 iOS 应用程序提供服务,而 JSON 是我们处理传入/传出数据的方式。

这是来自 service.php 的 处理 片段:

    public function putUser($datos) {
        if (!empty($datos)) {
            $usuario = json_decode($datos);
            $this->log .= implode("/", $usuario) . "\r\n";

在这种情况下,$datos 是来自请求的 JSON 编码数据。它在 controller.php(上面的代码)中作为 $id 接收。由于这是我的第一个 Web 服务,很可能我在这里做的很糟糕,但我有点盲目。

我尝试了服务处理代码的不同变体。使用 json_decode($datos, true) 也不起作用。我明白了

'Unexpected token <a href='function.implode'>function.implode</a>]: Invalid arguments pass in /home/refine /public_html/sushigo/palma/service.php 在第 344 行。

我知道 SOAP 通常是编写此类自定义代码的更好替代方案,但现在,我需要坚持使用此代码并为我的下一个项目实施更好的替代方案。你能告诉我我做错了什么吗?

【问题讨论】:

  • 你能发布$datos变量的内容吗?它可能不是有效的 JSON 字符串。
  • 我发现破坏有效 JSON 的最常见问题是当您打开 PHP 警告并包含在脚本输出中时。

标签: php json implode


【解决方案1】:

错误消息基本上表明它不是一个有效的 JSON - 而且这样的错误消息通常是正确的。

您的错误出现在发送/接收代码中。可能您以一种形式发送 JSON 并尝试以其他方式访问它。由于我无法查看手机发送的请求,我猜想:

  • 您将数据作为 application/json 发送并尝试以 url 编码形式接收它。如果您不了解其中的区别,这就是您的问题。
  • 您在 JSON 数据上使用了斜杠,这是错误的。除非你打开了magic_quotes,这也是错误的(即:magic_quotes 和stripslashes 都必须去)。

【讨论】:

  • 愚蠢的我......我真的不需要执行 json_decode。我的同事通过 POST 向我发送了一个带有参数的字符串。据说是 JSON,但似乎不是。鉴于此,我只需要删除对 j​​son_encode 的任何引用,作为普通 print_r($_POST["datos"]);给了我提示。它本身是数组格式,所以这里没有 JSON 解码工作。感谢您的提示! :)
  • 很高兴听到它有效:-) 尽管如此,我还是会检查一下stripslashes 代码。可能您只需要 ((int)$todos)。
猜你喜欢
  • 2020-08-27
  • 2012-11-28
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多