我有一个看起来像这样的代码
"""
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对其进行解码...是否有任何类或函数可以对此进行解码以转换为数组( )?
答案 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。所以你根本不必处理来回转换。