通过json_decode解码JSON输入时出错

时间:2013-03-15 10:40:40

标签: php json implode

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

这是来自controller.php的采集片段:

    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,例如 getCategories getCategoryById getProducts getProductById 。这些是在寿司餐厅获得菜肴类别和菜肴的方法。)

对于任何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 的形式收到。由于这是我的第一个网络服务,我很可能在这里做了一些非常糟糕的事情,但我有点盲目。

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

  

'意外的令牌&lt;'作为回复,并以原始形式(使用谷歌Chrome的高级REST客户端)说:''警告:implode()[<a href='function.implode'>function.implode</a>]:在/ home / refine / public_html / sushigo / palma中传递的参数无效第344行的/service.php。

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

1 个答案:

答案 0 :(得分:1)

错误消息基本上表示它不是有效的JSON - 并且此类错误消息通常是正确的。

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

  • 您将数据作为application / json发送,并尝试将其作为url编码表单接收。如果你不明白其中的区别,这就是你的问题。
  • 你在JSON数据上使用stripslashes,这是错误的。除非你启用了magic_quotes,这也是错误的(也就是说:magic_quotes和stripslashes都必须去)。