Laravel中如何将Redis缓存读取的字符串转换为JSON数组?
问题原因
你从Redis获取到的s:13:"{"foo":"bar"}";是PHP序列化后的字符串格式,s代表数据类型为字符串,13代表字符串长度,后面包裹的是实际存储的内容。出现该问题一般是存入Redis时调用了PHP的serialize()方法,或是Laravel缓存驱动默认做了序列化处理。
转换为目标JSON数组的实现方法
1. 直接处理已拿到的序列化字符串
两步操作即可得到预期结构:先反序列化拿到原始JSON内容,再封装为外层数组结构:
// 第一步:反序列化Redis返回的字符串,得到原始{"foo":"bar"}内容 // 传入allowed_classes参数可避免反序列化安全风险 $rawJson = unserialize($redisValue, ['allowed_classes' => false]); // 第二步:把JSON转为数组后包裹成外层数组,得到预期结构 $targetArray = [json_decode($rawJson, true)]; // 如果需要输出JSON字符串格式的[{"foo":"bar"}] $targetJson = json_encode($targetArray);
2. 从存入环节优化,避免后续重复处理
如果要后续直接从Redis读取到目标格式,存入时跳过默认序列化,直接存最终JSON即可:
// 直接存入目标结构的JSON $saveData = [["foo" => "bar"]]; Redis::set('your_cache_key', json_encode($saveData)); // 后续读取时直接解码即可拿到目标数组 $targetArray = json_decode(Redis::get('your_cache_key'), true);
如果使用Laravel的Cache门面操作,也可以直接存入原始JSON字符串:
Cache::store('redis')->put('your_cache_key', json_encode($saveData), 3600);
内容的提问来源于stack exchange,提问作者felcon albaladejo
相关产品推荐
相关产品推荐

