drtiwd06558 2015-10-27 15:37 采纳率: 100%
浏览 4799
已采纳

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

我正在尝试通过PHP在Redis中存储JSON数据,但是通过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不会拒绝的字符串?

  • 写回答

1条回答 默认 最新

  • duanqiang5722 2015-11-28 14:10
    关注

    Well, it turns out that line 118 at https://github.com/joelcox/codeigniter-redis/blob/develop/libraries/Redis.php

    public function command($string)
    {
        $slices = explode(' ', $string); /* <-- HERE  */
        $request = $this->_encode_request($slices[0], array_slice($slices, 1));
        return $this->_write_request($request);
    }
    

    was blindly splitting the entire command by the space character.

    Since I had spaces in my data (what real world data does not...), this was breaking Redis CLI syntax.

    So I had to escape spaces (replaced by custom string) to get it to work properly.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧