我正在尝试通过 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> get test1
"{\"array\":[1,2,3],\"number\":123,\"object\":{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"},\"string\":\"Hello World\"}"
现在,在 serialize() 或 json_encode() 中有一个简单的参数可以让这种情况自动发生,
或者
我必须使用 preg_replace() 编写一个自定义函数,以便在存储时添加斜杠,然后在检索时删除斜杠,并希望没有特定的棘手数据会破坏我基于自定义正则表达式的代码。
如果有适当的方法,我觉得第二种选择确实不可取。
任何想法这样的选择会是什么?
我无法使用 Predis(我尝试了https://github.com/nrk/predis/tree/php5.2_backport,因为我正在使用 PHP 5.2)但后来发现https://github.com/joelcox/codeigniter-redis它适用于所有基本数据类型。
那么,serialize() / json_encode() 的选项/参数是什么,它将允许 redis-cli 不会拒绝的字符串?