我已经尝试了每个方法来返回JSON编码的PHP对象 - 为什么它不起作用?

时间:2014-01-27 10:39:46

标签: javascript php json

解决方案:

基本上,没有一个。 $ _Sock是一个资源,因此不能通过json_encode()传递。不幸的是,连接是通过$ .post建立的,这意味着它不能跨多个页面保存(除非像Jon建议的那样使用应用程序服务器。)

每次建立连接都没有特别的不便;它只是一种可以容忍的烦恼。我将不得不依赖于每次重新建立连接的模型,以便通过RCON服务器发送命令。

感谢Ryan和Jon的巨大帮助!


原帖:


我尝试了dataType: 'json'$.parseJSON()Header("Content-type: application/json"),但是当我尝试返回json_encode()数组或对象时,我遇到了这个错误:

    Warning: json_encode(): type is unsupported, encoded as null

这是JavaScript $ .post:

    $.post("rcon.php",
    {
        ip:server.ip,
        port:server.rcon.port,
        pwd:server.rcon.pwd
    },
    function(data){
        alert(data);
        $("#output").val($("#output").val()+data+"\n");
    });

...这里是返回数据的PHP:

    $r = new minecraftRcon($rconServer, $rconPort, $rconPass);
    if ($r->Auth()) { $response = "Authenticated."; } else { $response = "Authentication failed."; }
    echo json_encode($r);

我已经在这里待了3个小时。我根本不明白我需要做些什么才能让它发挥作用。我试过gettype,它确认数据确实是一个对象。 json_encode应该接受它,但它“不受支持”。请帮忙 - 我失去了理智。


的var_dump($ R):

    <pre class='xdebug-var-dump' dir='ltr'>
    <b>object</b>(<i>minecraftRcon</i>)[<i>1</i>]
      <i>public</i> 'Password' <font color='#888a85'>=&gt;</font> <small>string</small><font color='#cc0000'>'derp'</font> <i>(length=4)</i>
      <i>public</i> 'Host' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'localhost'</font> <i>(length=9)</i>
      <i>public</i> 'Port' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'25575'</font> <i>(length=5)</i>
      <i>public</i> '_Sock' <font color='#888a85'>=&gt;</font> <b>resource</b>(<i>4</i><font color='#2e3436'>,</font> <i>stream</i>)
      <i>public</i> '_Id' <font color='#888a85'>=&gt;</font> <small>int</small> <font color='#4e9a06'>1</font>
    </pre>

这基本上就是我要做的事情:

  1. 通过向PHP发送$ .post请求来创建与Minecraft服务器的RCON连接,这将建立连接。
  2. 返回响应(“已验证”或“身份验证失败”)以指示成功和创建的对象供以后使用(以避免创建多个连接。)
  3. 通过此已创建的RCON对象发送命令,方法是将其返回到JS $ .post并将其存储在页面上的变量中。
  4. 以上所有内容都将通过一个.php页面完成,输出会被警告并打印到textarea(有时根本不起作用。)

2 个答案:

答案 0 :(得分:2)

documentation所述,您无法使用json_encode对资源类型进行编码。当前代码尝试执行此操作,因为类minecraftRcon公开其值为资源的属性$_Sock

然而,目前尚不清楚为什么你的JS / PHP代码不能整体运作。由于您无法从PHP访问(或甚至查看)任何“内部”资源值,因此几乎可以肯定您并未尝试从JS执行此操作,因此虽然警告有效并且您应该修复它,但它可能不会对你目前的问题充满信心。

答案 1 :(得分:0)

您不能直接在json_encode()中编码对象。

您需要将对象转换为数组,您可以使用以下内容:

$data = get_object_vars($r)

编码$data