Php 在Redis中将JSON存储为字符串时转义特殊字符

Php 在Redis中将JSON存储为字符串时转义特殊字符,php,json,codeigniter,redis,redis-cli,Php,Json,Codeigniter,Redis,Redis Cli,我试图通过PHP将JSON数据存储在Redis中,但通过Redis cli命令行客户端进行测试 在这两个客户端中,我似乎都无法存储JSON而不进行某种转义 redis 127.0.0.1:6379> set test1 {"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"} Invalid argument(s) 不起作用 redis 127.0.0.1:6379&g

我试图通过PHP将JSON数据存储在Redis中,但通过Redis cli命令行客户端进行测试

在这两个客户端中,我似乎都无法存储JSON而不进行某种转义

redis 127.0.0.1:6379> set test1 {"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}
Invalid argument(s)
不起作用

redis 127.0.0.1:6379> set test1 '{"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}'
Invalid argument(s)
尝试单引号。不起作用

redis 127.0.0.1:6379> set test1 \{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}
Invalid argument(s)
redis 127.0.0.1:6379> "\{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}"
OK
试图用反斜杠逃避一切。不起作用

redis 127.0.0.1:6379> set test1 \{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}
Invalid argument(s)
redis 127.0.0.1:6379> "\{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}"
OK
尝试用反斜杠和双引号转义所有内容

而且有效

redis 127.0.0.1:6379> get test1
"{\"array\":[1,2,3],\"number\":123,\"object\":{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"},\"string\":\"Hello World\"}"
现在serialize()或json_encode()中有一个简单的参数,允许自动执行此操作

我必须使用preg_replace()编写一个自定义函数,在存储时添加斜杠,然后在检索时删除斜杠,希望没有特定的棘手数据会破坏我基于正则表达式的自定义代码

我觉得如果有适当的方法,第二种选择是不可取的

你知道这样的选择是什么吗

我无法使用Predis(我尝试过,因为我正在使用PHP5.2),但后来发现它可以完美地用于所有基本数据类型


那么,serialize()/json_encode()的选项/参数是什么,它将允许redis cli不会拒绝的字符串呢?

嗯,结果是第118行

public函数命令($string)
{
$slices=explode(“”,$string);/*_encode_请求($slices[0],array_slice($slices,1));
返回$this->\u write\u请求($request);
}
盲目地用空格字符分割整个命令

因为我的数据中有空格(现实世界中的数据没有…),这打破了Redis CLI语法


因此,我必须跳出空格(由自定义字符串替换)以使其正常工作。

我现在没有任何地方运行redis进行测试,但如果有任何帮助,我可以告诉你,我从来没有经历过这样的扭曲。试着设置简单的字符串,看看你的测试数据中哪一部分会让你感到痛苦。于是我很好奇,安装了redis,你的测试的单引号版本对我来说很好。@Jerry:谢谢你的回答。问题出在command()函数中。。见下面的答案。