Laravel PHP JSON解码

时间:2016-11-08 09:26:35

标签: php json laravel

我有一个看起来像这样的代码



"""
HTTP/1.0 200 OK\r\n
Cache-Control: no-cache\r\n
Content-Type:  application/json\r\n
Date:          Tue, 08 Nov 2002 05:46:42 GMT\r\n
\r\n
{\n
    "request": {\n
        "body": ""\n
    },\n
    "response": {\n
        "status": 1,\n
        "users": [\n
            {\n
                "user_id": 1,\n
                "username": "john.doe",\n
                "account_status": "1",\n
                "online_status": 1,\n
            }
        ]\n
    }\n
}
"""




这个值来自数据库,我唯一的问题是,我无法使用json_decode对其进行解码...是否有任何类或函数可以对此进行解码以转换为数组( )?

1 个答案:

答案 0 :(得分:1)

正如我在评论中已经提到的那样,你所拥有的是一个完整的HTTP响应。它将JSON数据保存在正文中,因此您需要解析它。这是一种方法:

preg_match("/\{(.*)\}/s", $rawResponse, $matches);

这匹配了第一个“{”和最后一个“}”之间的所有内容,这是JSON数据所在的位置,并将每个匹配项存储在$matches中。由于只应该有一个匹配,我们对$matches[0]感兴趣。

现在你只需要解码它:

$data = json_decode($matches[0]);

// or 
// $data = json_decode($matches[0], true) 
// if you want an associative array instead of an object.

警告:这不适用于您的示例,因为它不是有效的JSON。 "online_status": 1,后的逗号使其无效,因此json_decode将返回false。但我猜你刚刚在你的问题中删除了一些内容以提高可读性。

如果您可以控制存储内容的方式,那么您一定要考虑只存储JSON数据,这样您就不必处理这些问题。如果你仍然需要整个原始响应,可能将它存储在另一个表/列中。这使得很多更容易,尤其是对于Laravel。例如,如果数据类似details模型上的Transaction字段,则可以执行以下操作:

class Transaction extends Model {

    protected $casts = [
        'details' => 'json'
    ];

}

现在,当访问$transaction->details时,您将自动获得一个数组。这甚至适用于两个方向:$transaction->details = ['new' => 'data']会在保存之前将其转换为JSON。所以你根本不必处理来回转换。