在PHP中解码多个JSON对象


Decoding multiple JSON objects in PHP

我使用PHP套接字来管理聊天应用程序中的数据,下面是我期望从套接字中得到的示例JSON字符串:

{ "m_time" : "2015-04-07 11:37:35", "id" : "29", "msg" : "Hai there. This is a test message"}

但有时在套接字中读取连接的多个对象,如下所示:

{ "m_time" : "2015-04-07 11:37:35", "id" : "30", "msg" : "Hai there 1"}{ "m_time" : "2015-04-07 11:37:36", "id" : "31", "msg" : "Hai there 2"}{ "m_time" : "2015-04-07 11:37:37", "id" : "32", "msg" : "Hai there 3"}

无论是单个对象还是多个对象,我都如何json_decode

套接字读取的PHP代码:

while(@socket_recv($changed_socket, $buf, READ_SIZE, 0) >= 1)
{
    if(!$buf) logResponse('Socket Read Failed for '. $changed_socket);
    $received_text = $buf; //unmask data
    $tst_msg = json_decode($received_text); //json decode 
    logResponse('Received Data: '. $received_text);
}
// logResponse() is used to write a log file log.html

整理您的输入,在每个json字符串后添加逗号,发送方式如下:

{ "m_time" : "2015-04-07 11:37:35", "id" : "30", "msg" : "Hai there 1"},{ "m_time" : "2015-04-07 11:37:36", "id" : "31", "msg" : "Hai there 2"},{ "m_time" : "2015-04-07 11:37:37", "id" : "32", "msg" : "Hai there 3"},

php函数

function json_decode_multi($s, $assoc = false, $depth = 512, $options = 0) {
    if(substr($s, -1) == ',')
        $s = substr($s, 0, -1);
    return json_decode("[$s]", $assoc, $depth, $options);
}
var_dump(json_decode_multi('{ "m_time" : "2015-04-07 11:37:35", "id" : "30", "msg" : "Hai there 1"},{ "m_time" : "2015-04-07 11:37:36", "id" : "31", "msg" : "Hai there 2"},{ "m_time" : "2015-04-07 11:37:37", "id" : "32", "msg" : "Hai there 3"},'));

输出:

array(3) {
  [0] =>
  class stdClass#1 (3) {
    public $m_time =>
    string(19) "2015-04-07 11:37:35"
    public $id =>
    string(2) "30"
    public $msg =>
    string(11) "Hai there 1"
  }
  [1] =>
  class stdClass#2 (3) {
    public $m_time =>
    string(19) "2015-04-07 11:37:36"
    public $id =>
    string(2) "31"
    public $msg =>
    string(11) "Hai there 2"
  }
  [2] =>
  class stdClass#3 (3) {
    public $m_time =>
    string(19) "2015-04-07 11:37:37"
    public $id =>
    string(2) "32"
    public $msg =>
    string(11) "Hai there 3"
  }
}

请记住:协议设计不稳定。如果@socket_recv($changed_socket, $buf, READ_SIZE, 0)满足最大read_SIZE,则它可以读取半个字符串(断开)。如果数据解码失败,您应该保留最后接收到的数据,并读取更多数据以附加到其中,然后重试。